Синтаксическая проблема инициализации C++11 (с gcc 4.5 / 4.6)

Что не так со следующим кодом C++11:

struct S
{
    int a;
    float b;
};

struct T
{
    T(S s) {}
};

int main()
{
    T t(S{1, 0.1});  // ERROR HERE
}

gcc выдает ошибку в указанной строке (я пробовал как gcc 4.5, так и экспериментальную сборку gcc 4.6)

Это не допустимый C++11, или реализация gcc не завершена?

РЕДАКТИРОВАТЬ: Вот ошибки компилятора:

test.cpp: In function int main():
test.cpp:14:10: error: expected ) before { token
test.cpp:14:10: error: a function-definition is not allowed here before { token
test.cpp:14:18: error: expected primary-expression before ) token
test.cpp:14:18: error: expected ; before ) token

2 ответа

Решение

Согласно предложению N2640, ваш код должен работать; временный объект S должен быть создан. Очевидно, g++ пытается проанализировать этот оператор как объявление (функции, ожидающей S), поэтому для меня это выглядит как ошибка.

Кажется неправильным вызывать конструктор без скобок, и это работает:

struct S
{
    int a;
    float b;
};

struct T
{
    T(S s) {}
};

int main()
{
    T t(S({1, 0.1}));  // NO ERROR HERE, due to nice constructor parentheses
    T a({1,0.1}); // note that this works, as per link of Martin.
}

Казалось бы логично (по крайней мере мне :s) что твой пример не работает. Замена S на vector<int> дает тот же результат.

vector<int> v{0,1,3}; // works
T t(vector<int>{0,1,2}); // does not, but
T t(vector<int>({0,1,2})); // does
Другие вопросы по тегам