2015-10-27 3 views
4

Я не понимаю, почему компилируется следующий код?{} vs.() инициализация члена класса

struct A{ A(int); }; struct B{ A a{1}; }; 

, но это не делает:

struct A{ A(int); }; struct B{ A a(1); }; 

ошибка: ожидается '' или '...' перед числовая константа

Есть ли какой-то причине компилятор не принимает вторая форма? Я знаю о наиболее неприятных parse ambiguiy, но я делаю не думаю, что этот вопрос связан.

EDIT: Как объясняет Боу в комментариях ниже, я был неправ. Вопрос - это, связанный с досадным разбором.

Я попробовал это на GCC-5.1.0 с --std = C++ 11

+0

Я думаю, что ** ** связано и позволяет использовать A A {int()}; ', но конкретно не' A a (int()); '. –

+1

@Bo: Последний объявляет функцию ** ** **, не так ли? –

+1

@Ben - Да, поэтому он не используется для инициализации. :-) А также запрещает 'A a (1);' потому что он приглашает досадный синтаксический анализ. –

ответ

10

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

Синтаксический конструктор имеет имя brace-or-equal-initializer (в C++ 11 и C++ 14, как отмечает Chris в комментарии, C++ 1z меняет имя).

+0

Начиная с Kona, это было изменено на [* default member initializer *] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0134r0.html). – chris