Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 29.05.2016
Сообщений: 5
1

Передача std::string по константной ссылке \ значению

29.05.2016, 17:23. Показов 3274. Ответов 4

Суть вопроса: есть простенький словарь с std::vector в качестве приватного поля.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
struct StudentGrade
{
    std::string name;
    char grade;
};
 
class GradeMap
{
private:
    std::vector<StudentGrade> m_map;
public:
    //....
    char& operator[](const std::string &key);
};
char& GradeMap::operator[](const std::string &key)
{
    //....
}
int main()
{
    GradeMap grades;
    grades["Joe"] = 'A';
    // ....
}
Все работает отлично, но непонятно следующее:
1) Почему передача строки (const char[...]) в качестве параметра (const std::string&) компилируется нормально, а при перегрузке оператора с параметром std::string& (без const) требует явного вызова конструктора std::string:
grades[std::string(строка)] = ...
Я так понимаю, при передаче параметра как константы с++ сам преобразует его из char[...] в временный объект const std::string. Но почему этого не происходит при передаче обычной ссылки?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.05.2016, 17:23
Ответы с готовыми решениями:

Передача по константной ссылке
void print(const std::string strs, const char c); void print(const std::vector&lt;std::string&gt;&amp;...

Передача параметра по константной ссылке - что это?
объясните мне пожалуйста что такое передача параметра в функцию по константной ссылке? я просто...

Аллокация памяти при передаче string в функцию по константной ссылке
Поясните пожалуйста данный пример: // C++11 #include &lt;string&gt; void get_vendor_from_id(const...

Передача функции указатель на элемент std::vector<std::string>
Доброй ночи тем, кому не спится (или живет в другом часовом поясе:p)! Есть функция, требующая в...

4
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
29.05.2016, 18:26 2
Лучший ответ Сообщение было отмечено Stickman как решение

Решение

Цитата Сообщение от Stickman Посмотреть сообщение
1) Почему передача строки (const char[...]) в качестве параметра (const std::string&) компилируется нормально, а при перегрузке оператора с параметром std::string& (без const) требует явного вызова конструктора std::string:
временный объект "Joe" нельзя присвоить ссылке, а константной ссылке можно... другими словами
C++
1
2
const std::string& hi = "hello world";   //скомпилируется
std::string& hi = "hello world";          //не скомпилируется (ну может только на висуал студии будет норм)
1
0 / 0 / 0
Регистрация: 29.05.2016
Сообщений: 5
29.05.2016, 18:33  [ТС] 3
Спасибо, понял.
Но почему это срабатывает при const, а при обычной ссылке нет? То есть, это особенность С++ или особенность реализации std::string?
0
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
29.05.2016, 19:36 4
Цитата Сообщение от Stickman Посмотреть сообщение
Но почему это срабатывает при const, а при обычной ссылке нет? То есть, это особенность С++ или особенность реализации std::string?
особенность c++... ссылка это как указатель почти - ссылка на адрес памяти указывает на тот же, на который и объект ей присвоенный... ну а если объект временный, то он сразу умирает... и на что остается ссылке указывать?) на мусор... а константная запись у ссылки запрещает умирать объекту временному который присваивается этой ссылке... он жив пока жива константная ссылка, указывающая на него
0
0 / 0 / 0
Регистрация: 29.05.2016
Сообщений: 5
29.05.2016, 19:39  [ТС] 5
А, да, про этот "трюк" с возвратом константного референса на временный объект я помню.
Благодарю за разъяснение.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.05.2016, 19:39

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка...

Передача по ссылке и по значению
Эта тема стара как мир, но я хотел уточнить одну вещь. QBluetoothAddress* address = new...

Передача данных по значению и по ссылке
Всем привет! Помогите плз разобраться в передаче данных в качестве параметров функции. *var и...

Передача std::vector в конструктор[по ссылке\указателю ?]
Доброго времени суток. Есть такой интерфейс класса: class HH_model_class { private:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.