Вывод аргументов шаблона класса с помощью фигурных скобок вокруг одного из скалярных инициализаторовC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Вывод аргументов шаблона класса с помощью фигурных скобок вокруг одного из скалярных инициализаторов

Сообщение Anonymous »

У меня есть шаблон агрегатного класса с массивом из двух элементов внутри:

Код: Выделить всё

template
struct A { T t[2]; };
и я хотел бы инициализировать объект этого класса, используя вывод аргументов шаблона класса (CTAD) из типа второго элемента, поэтому первый аргумент — это braced-init-list, не имеющий типа:

Код: Выделить всё

constexpr A a{ { {1}, 2.5 } };
static_assert( a.t[0] == 1. && a.t[1] == 2.5 );
Это действительно работает в GCC, Clang и EDG, однако последние два выводят соответствующие предупреждения.

Код: Выделить всё

warning: braces around scalar initializer [-Wbraced-scalar-init]
warning: extra braces are nonstandard
Очевидно, что удаление фигурных скобок вокруг 1 (как следует из предупреждений) приводит к сбою компиляции везде.
И только MSVC отклоняет программу с ошибкой:

Код: Выделить всё

(5): error C2641: cannot deduce template arguments for 'A'
(5): note: 'A A(const double (&)[2])': cannot convert argument 1 from 'initializer list' to 'const double (&)[2]'
...
А если инициализация A выполняется с помощью круглых скобок:

Код: Выделить всё

constexpr A b( { {1}, 2.5 } );
затем GCC (а не остальные) передумал, начав показывать длинную ошибку:

Код: Выделить всё

:9:29: error: class template argument deduction failed:
:9:29: error: no matching function for call to 'A(
)'
:9:29: note: there are 3 candidates
...
:2:8: note: candidate 3: 'A(T [2]) -> A [with T = double]'
:2:8: note: no known conversion for argument 1 from '
' to 'double*
Онлайн-демо
Какая реализация здесь правильная?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»