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

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

29.05.2016, 17:23. Показов 7315. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.05.2016, 17:23
Ответы с готовыми решениями:

Передача по константной ссылке
void print(const std::string strs, const char c); void print(const std::vector&lt;std::string&gt;&amp; vstrs, const char c); Нужно организовать...

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

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

4
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
29.05.2016, 18:26
Лучший ответ Сообщение было отмечено 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  [ТС]
Спасибо, понял.
Но почему это срабатывает при const, а при обычной ссылке нет? То есть, это особенность С++ или особенность реализации std::string?
0
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
29.05.2016, 19:36
Цитата Сообщение от Stickman Посмотреть сообщение
Но почему это срабатывает при const, а при обычной ссылке нет? То есть, это особенность С++ или особенность реализации std::string?
особенность c++... ссылка это как указатель почти - ссылка на адрес памяти указывает на тот же, на который и объект ей присвоенный... ну а если объект временный, то он сразу умирает... и на что остается ссылке указывать?) на мусор... а константная запись у ссылки запрещает умирать объекту временному который присваивается этой ссылке... он жив пока жива константная ссылка, указывающая на него
0
0 / 0 / 0
Регистрация: 29.05.2016
Сообщений: 5
29.05.2016, 19:39  [ТС]
А, да, про этот "трюк" с возвратом константного референса на временный объект я помню.
Благодарю за разъяснение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.05.2016, 19:39
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru