Конструктор C ++ по умолчанию: строковые параметры vs строковые параметры ()

Возможный дубликат:
Не являются ли круглые скобки в конструкторе без аргументов языковым стандартом?

Может ли кто-нибудь объяснить, почему эта строка не дает мне ошибки:

string params;
params+="d";

но эти строки:

string params();
params+="d";

дайте мне эту ошибку: ошибка C2659: '+ =': функция как левый операнд


person kakush    schedule 16.10.2012    source источник
comment
См. Самый неприятный синтаксический анализ.   -  person Some programmer dude    schedule 16.10.2012


Ответы (2)


Это не объект:

 string params();

Это строка, возвращающая функцию:

 string params();

Нравится:

 string params(void);

Итак, ошибка очевидна: функция как левый операнд

У этой проблемы есть собственное название: http://en.wikipedia.org/wiki/Most_vexing_parse

person PiotrNycz    schedule 16.10.2012
comment
так что строка params () не является объектом, а строка params (word) является объектом? - person kakush; 16.10.2012
comment
@kakush Да, слово - это не тип - это значение - значит, это объект. Когда компилятор сомневается, является ли выражение объявлением функции или объектом, он всегда выбирает объявление функции. В вашем примере со словом - сомнений нет. - person PiotrNycz; 16.10.2012
comment
спасибо @PiotrNycz. Итак, если я хочу использовать пустую строку const ', как мне это сделать? - person kakush; 16.10.2012
comment
@kakush: вы пишете string params;, который вызывает конструктор класса по умолчанию, если он объявлен (string делает). Если вам нужен какой-то тип T, который может вообще не иметь конструктора (например, встроенные типы), вы можете написать T t = T(); при условии, что он копируемый (или перемещаемый в C ++ 11). Если у вас есть тип, который либо имеет объявленный конструктор по умолчанию , либо является копируемым, но вы не знаете, какой из них, то в C ++ 03 у вас есть проблема. В C ++ 11 вы можете написать T t{}; для инициализации чего угодно. - person Steve Jessop; 16.10.2012

В первом случае с

string params;

создает экземпляр строки с помощью конструктора по умолчанию.

Во втором случае

string params();

создает указатель на функцию, возвращающую строку. В этом типе operator + = (const string &), по-видимому, не определен.

Да, это немного сбивает с толку особенность языка, потому что, когда вы используете не конструктор по умолчанию, вы действительно можете написать, например.

string params("d");
person David L.    schedule 16.10.2012