unção @constexpr com argumento de referência não utilizado - gcc vs clang
Considere o seguinte código:
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++
(tronco compila.g++
(tronco falha com o seguinte erro:
<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);
| ~^~~
Changingk(T&)
parak(T)
resolve o problema. Parece-me que o problema está relacionado ao fato de o argumento de referência não ser umconstant expression, mas não é usado como parte dek
.
Que compilador está correto aqu