2013-05-02 4 views

ответ

26

Я не уверен на 100% об этом, но это может быть для предотвращения двусмысленности синтаксиса. Например, рассмотрим следующий класс:

class BadTimes { 
    struct Overloaded; 
    int Overloaded;   // Legal, but a very strange idea. 

    int confusing(Overloaded); // <-- This line 
}; 

Что означает обозначенная линия? Как написано, это объявление функции-члена с именем confusing, которое принимает в качестве параметра объект типа Overloaded (имя которого не указано в объявлении функции) и возвращает int. Если бы C++ 11 разрешал инициализаторам использовать круглые скобки, это было бы неоднозначным, так как оно также может быть определением члена типа int с именем confusing, который инициализируется значением элемента данных Overloaded. (. Это связано с текущей эмиссии с Most Vexing Parse)

Требуя фигурные скобки, эта двусмысленность снимается:

class BadTimes { 
    struct Overloaded; 
    int Overloaded;   // Legal, but a very strange idea. 

    int confusing{Overloaded}; // <-- This line 
}; 

Теперь стало ясно, что confusing на самом деле является int инициализируется значением Overloaded , потому что нет возможности прочитать его как объявление функции.

Надеюсь, это поможет!

+1

Не могли бы вы объяснить, почему «запутывание» - это определение, а не декларация? ** "это определение функции-члена с именем confusing, которая принимает в качестве параметра объект типа Overloaded" **. У меня такая путаница, потому что она должна быть двусмысленной? –

+1

@ Koushik- Вы правы, это должно быть заявление, а не определение. Позвольте мне исправить это ... – templatetypedef