2013-08-11 3 views
2

В моей программе у меня естьВ чем разница между строковым объектом() и объектом?

stringstream strumien(); //1 
stringstream strumien; // 2 
strumien<<"napis "<<8<<endl; 

и первая строка генерирует следующее сообщение об ошибке

недействительные операнды типов 'станд :: stringstream() {ака станд :: basic_stringstream()}' и 'Const символ [7] в двоичную 'оператора < <'

но второй работает должным образом. (конечно, всегда один из них прокомментирован)
Так в чем же разница между ними? Потому что я всегда думал, что они равные определения объекта.

+4

Первый, вероятно, MVP. Он думает, что вы объявляете функцию, которая не принимает аргументов и возвращает строковый поток. – Borgleader

+0

И с этим @Borgleader ссылается на http://en.wikipedia.org/wiki/Most_vexing_parse FYI. – Bart

ответ

7

Что-то, что выглядит как объявление функции - объявление функции. Это

T name(); 

объявляет функцию под названием name не принимает никаких аргументов и возвращает T. Это называется Most Vexing Parse. Есть два потенциальных исправления для устранения этой проблемы: оставляя скобку от или с помощью C++ 2011 «единообразного инициализацию» (что является грубым неправильным):

T name{}; 
0

Первая линия неоднозначна формальной грамматики: либо его можно интерпретировать как объявление функции или объявление и создание объекта с конструктором no-arg. Язык предпочитает рассматривать его как объявление функции, так как можно отказаться от круглых скобок для вызова конструктора no-arg.

1

Первая строка на самом деле является декларацией. Даже если это, кажется, так же, как ваш второй, это не ...

Так

T name(); 

объявляет функция name возвращает объект типа T.

C++ стандартных состояний эта двусмысленность:

6,8 Разрешение неоднозначности [stmt.ambig]

Существует неопределенность в грамматике с участием выражение-заявления и декларации: Выражение-заявление с преобразование явного типа в стиле функции, поскольку его самое левое подвыражение может быть неотличимым от декларации, где первый декларатор начинается с (. В этих случаях заявление является заявкой.

Эта двусмысленность также называется The Most Vexing Parse.


Существует новый способ решить эту проблему, так как C++ 11, он называется uniform initialization syntax.

Он работает как:

T name{}; 
Смежные вопросы