Рассмотрим следующий фрагмент кода:
template <bool> struct B { };
template <typename T>
constexpr bool pred(T t) { return true; }
template <typename T>
auto f(T t) -> decltype(B<pred(t)>{})
{
}
-
clang++ (соединительная линия) компилирует код
-
g++ (trunk) завершает компиляцию со следующей ошибкой:
src:7:34: error: template argument 1 is invalid auto f(T t) -> decltype(B<pred(t)>{}) ^ src:7:34: error: template argument 1 is invalid src:7:34: error: template argument 1 is invalid src:7:34: error: template argument 1 is invalid src:7:34: error: template argument 1 is invalid src:7:34: error: template argument 1 is invalid src:7:25: error: invalid template-id auto f(T t) -> decltype(B<pred(t)>{}) ^ src:7:36: error: class template argument deduction failed: auto f(T t) -> decltype(B<pred(t)>{}) ^ src:7:36: error: no matching function for call to 'B()' src:1:24: note: candidate: 'template<bool <anonymous> > B()-> B<<anonymous> >' template <bool> struct B { }; ^ src:1:24: note: template argument deduction/substitution failed: src:7:36: note: couldn't deduce template parameter '<anonymous>' auto f(T t) -> decltype(B<pred(t)>{}) ^
Хотя диагностика g++ вводит в заблуждение, я предполагаю, что проблема здесь в том, что t
не является постоянным выражением. Изменение кода на...
decltype(B<pred(T{})>{})
... исправляет ошибку компиляции на g++: живой пример на godbolt.org
Какой компилятор работает здесь правильно?