и OP спрашивает, какой компилятор верен, а не как это исправить. Хорошим ответом было бы сообщение OP о том, верны ли clang или gcc, чего у вас нет.
отрим следующий код:
template <int N, typename T> void f(T) { }
template <typename T>
constexpr int k(T&) { return 0; }
int main()
{
constexpr auto i = 1;
f<k(i)>([&i]
{
f<k(i)>(0);
});
}
clang++
(багажник) компилирует это.g++
(багажник) завершается со следующей ошибкой:
<source>: In lambda function:
<source>:11:19: error: no matching function for call to 'f<k<const int>((* & i))>(int)'
11 | f<k(i)>(0);
| ^
<source>:1:35: note: candidate: 'template<int N, class T> void f(T)'
1 | template <int N, typename T> void f(T) { }
| ^
<source>:1:35: note: template argument deduction/substitution failed:
<source>:11:19: error: '__closure' is not a constant expression
11 | f<k(i)>(0);
| ^
<source>:11:13: note: in template argument for type 'int'
11 | f<k(i)>(0);
| ~^~~
измененияk(T&)
вk(T)
решает проблему. Мне кажется, что проблема связана с тем, что ссылочный аргумент не являетсяпостоянное выражение, но не используется как частьk
.
Какой компилятор здесь правильный?