考虑下面的程序:
template<typename T>
constexpr int f()
{
T{}.i; // error if instantiated with [T = double]
return 42;
}
constexpr void g(char);
using U = decltype( g( {f<double>()} ) );
据我所知,最后一行是错误的,因为调用
f<double>()
在括号初始值设定项中,即使
f<T>
返回一个
int
,返回的值
智力
需要决定是否可以缩小到
char
正如预期的那样
g
.这需要定义
f
用
double
,这会导致错误。gcc和clang都拒绝使用此代码。
然而,如果
G
更改为接受
智力
参数:
constexpr void g(int);
那么,似乎没有必要实例化
F
自缩小转换以来
必须
达到目的事实上,gcc接受这一点,但clang仍在实例化
F
具有
双重的
拒绝接受
code
.此外,如果
F
只声明了,但没有定义,clang接受代码,这意味着不需要定义,也不应该实例化。
我的推理正确吗?这是一个叮当作响的错误,还是需要实例化,这实际上是一个gcc错误?