gpt4 book ai didi

c++ - decltype((void)T{}) in template Partial Specialization 不推导?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:20:48 24 4
gpt4 key购买 nike

template<typename T,typename U = void>
struct Test
{
static const int value = 0;
};
template<typename T>
struct Test<T, decltype((void)T{})>
{
static const int value = 2;
};

template<typename T>
struct Test<T*, decltype((void)T{})>
{
static const int value = 1;
};

int main(){
cout<<Test<int*>::value<<endl;
return 0;
}

gcc/clang 上的代码都出现错误:模棱两可,但是将 decltype 更改为 void_t 是可以的。为什么?

最佳答案

对我来说,这看起来像是一个编译器错误:你真的需要 T{} 的副作用吗? ? decltype((void)T{}) 的整体构造应该丢弃零初始化 T ,允许未评估的副作用——如果有的话,这种副作用有什么意义呢?
如果你用void来简化它, 甚至省略整个第二种类型,问题立即消失 ( live demo on wandbox ):

template<typename T, typename U = void>
struct Test
{
static const int value = 0;
};
template<typename T>
struct Test<T, void>
{
static const int value = 2;
};

template<typename T>
struct Test<T*, void>
{
static const int value = 1;
};

int main(){
std::cout << Test<int*>::value << "\n";
return 0;
}

也许我错过了一些复杂的细节,但我尝试了很多变体,包括 std::declval 的组合, std::result_of ,别名模板,typedef,这些都没有给我任何有意义的东西。
但是如果我们移动 decltype((void)T{})分开:

template<typename T>
using wrap = decltype((void)T{});

template<typename T>
struct Test<T, wrap<T>>
{
static const int value = 2;
};
template<typename T>
struct Test<T*, wrap<T>>
{
static const int value = 1;
};

GCC 大喊:ambiguous template instantiation for 'struct Test<int*, void>' .对我来说,这是方向错误的迹象。

关于c++ - decltype((void)T{}) in template Partial Specialization 不推导?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51110888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com