Проблема синтаксиса инициализации C ++ 11 (с gcc 4.5 / 4.6) - PullRequest
4 голосов
/ 03 января 2011

Что не так со следующим кодом 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 ]

3 голосов
/ 03 января 2011

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

0 голосов
/ 03 января 2011

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...