рассмотрите приведенный ниже код. Я определил очень простой класс, для которого компилятор генерирует неявный указатель вывода, поэтому его можно построить без явных аргументов шаблона. Однако вывод аргумента шаблона не работает для построения объекта из простого шаблона псевдонима, который только пересылается непосредственно в целевой класс:
template< typename A, typename B >
struct Foo {
Foo( A const &a, B const &b )
: a_(a), b_(b)
{ }
A a_;
B b_;
};
template< typename A, typename B >
using Bar = Foo<A, B>;
auto foobar() {
Foo r{1, 2};
Bar s{3, 4};
// ../src/geo/vector_test_unit.cpp: In function 'auto foobar()':
// ../src/geo/vector_test_unit.cpp:16:6: error: missing template arguments before 's'
// Bar s{3, 4};
// ^
return 1;
}
Как вы можете видеть из комментария кода выше, g++ дает мне ошибку об использовании шаблона с псевдонимом без шаблонных аргументов. Я надеялся в таком случае, что вывод аргумента шаблона будет перенаправлен.
Итак, мой вопрос: Является ли это экспресс-дизайном текущей формулировки предложения для вывода аргумента шаблона шаблона? Или это незавершенная функция или ошибка в текущей реализации функции g++? И это будет скорее вопросом для авторов предложения, или для Комитета по ИСО С++, но если кто-нибудь из них увидит это: было бы желательно, чтобы окончательная формулировка этой функции включала включение шаблонов псевдонимов, таких как это, также имеют неявные направляющие, сгенерированные для них?
Я могу понять, что поскольку шаблоны псевдонимов могут иметь любые параметры шаблона, не всегда возможно, чтобы компилятор успешно выводил аргументы шаблона целевого класса, но в таком случае я ожидал бы, что компилятор сможет таким же образом, что он может непосредственно для целевого класса.
Я создаю gcc, созданный из головы всего несколько дней назад, используя --std=c++1z
. Полная информация о версии: gcc version 7.0.0 20161201 (experimental) (Homebrew gcc HEAD- --with-jit)