2015-01-22 2 views
1

Я смущен около Y y {X{}};, что именно эта строка делает и какова его связь с самым неприятным анализом. Краткое объяснение ценится:Самый неприятный синтаксис C++ 11

#include <iostream> 

struct X { 
    X() { std::cout << "X"; } 
}; 
struct Y { 
    Y(const X &x) { std::cout << "Y"; } 
    void f() { std::cout << "f"; } 
}; 
int main() { 
    Y y {X{}}; 
    y.f(); 
} 

ответ

11

что именно эта линия делает

Это создает временный X, стоимость инициализации его вызвав конструктор по умолчанию, а затем использует это, чтобы инициализировать Y переменную, вызывая конструктор преобразования const X&.

где подключение к раздосадовать разборе

Если вы должны были попытаться написать это с помощью старой школы инициализации синтаксиса

Y y (X()); 

тогда так называемый «самый раздражающий синтаксического анализа» интерпретирует это как функцию, а не переменную, декларация: функцию с именем y, с типом возврата Y и единственным параметром, тип которого является (указателем на функцию), возвращающим X.

Вы можете добавить дополнительные скобки, так что она не может быть истолковано как объявление функции:

Y y ((X())); 

или, так как C++ 11, вы можете использовать скобки инициализацию, как ваш пример делает.

2
Y y {X{}}; 

Это идеальное и создает объект y проходящий временный объект типа X конструктору. Нет никакого досадного разбора (больше или иначе). На самом деле, строительство с использованием {} было введено, чтобы решить вопрос о неприятной разборе во многих случаях, например, такие:

Y y1(); 
Y y2(X()); 

И принадлежит (большинство) досаждать разобрана из-за которых и декларирует функцию, вместо объектов.

Однако, если вы используете фигурные скобки, называемые скобка инициализация:

Y y1{}; 
Y y2{X{}}; //as you've done yourself 

то и объявляет объекты, а не функции, как и ожидалось.

Смежные вопросы