Синтаксическая проблема инициализации 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