gpt4 book ai didi

c++ - 我的 is_complete 类型特征的实现是否暴露了编译器错误?

转载 作者:IT老高 更新时间:2023-10-28 12:54:10 25 4
gpt4 key购买 nike

我写了这个 C++11 trait 模板来检查一个类型是否完整:

template <typename...>
using void_t = void;

template <typename T, typename = void>
struct is_complete : std::false_type
{};

template <typename T>
struct is_complete<T, void_t<decltype(sizeof(T))>> : std::true_type
{};

并像这样测试它:

struct Complete {};

int main()
{
std::cout << is_complete<Complete>::value
<< is_complete<class Incomplete>::value
<< '\n';
}

我希望测试程序能够打印 10,这就是我使用 clang 3.4 编译它时得到的输出。然而,当使用 gcc 4.9 编译时,它会打印出 11 —— 错误地将 class Incomplete 标识为完整。

我不确定我的代码是否正确,但在我看来,即使它是错误的,它在两个编译器上的行为也应该相同。

问题 1:我的代码是否正确?
问题 2:我是否在其中一个编译器中发现了错误?

编辑:

我不是要求替换我的代码。我在问 gcc 或 clang 中是否存在错误,以及 这个特定的构造 是否正确。

最佳答案

问题似乎与 void_t 的定义有关。将其定义为

template<typename... Ts>
struct make_void { typedef void type;};

template<typename... Ts>
using void_t = typename make_void<Ts...>::type;

而不是在两个编译器 (Demo) 上产生正确的结果 (10)。

我相信这与 N3911 的第 2.3 节中提到的问题相同。 ,提出void_t的论文和CWG issue 1558 .本质上,该标准不清楚别名模板特化中未使用的参数是否会导致替换失败或被忽略。在委员会 2014 年 11 月的 session 上通过的 CWG 问题的决议澄清了问题中 void_t 的较短定义应该有效,并且 GCC 5.0 实现了该决议。

关于c++ - 我的 is_complete 类型特征的实现是否暴露了编译器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25833356/

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