gpt4 book ai didi

c++ - 为什么 C++20 的要求表达式的行为不符合预期?

转载 作者:行者123 更新时间:2023-12-04 04:25:33 25 4
gpt4 key购买 nike

#include <type_traits>

template<typename T>
struct IsComplete final
: std::bool_constant<requires{sizeof(T);}>
{};

int main()
{
struct A;
static_assert(!IsComplete<A>::value); // ok

struct A{};
static_assert(IsComplete<A>::value); // error
}
我预计第二个 static_assert应该是真的,因为 A 现在是一个完整的类型。
为什么 C++20 的要求表达式的行为不符合预期?

最佳答案

这是一个错误的期望。首先,类模板在翻译单元中只有一个实例化点:

[temp.point]

7 ... A specialization for a class template has at most one point ofinstantiation within a translation unit. A specialization for anytemplate may have points of instantiation in multiple translationunits. If two different points of instantiation give a templatespecialization different meanings according to the one-definitionrule, the program is ill-formed, no diagnostic required.


模板从不允许程序中的两个点对同一组参数的模板有不同的解释(一般情况下的 ODR 噩梦)。你基本上开始冒险进入鼻恶魔领域,因为你尝试了这个特性。
如果您认为使用 C++20 概念会改变任何事情,您将直接陷入格式错误;如果您将示例概念化,则无需诊断领域
template<typename T>
concept IsComplete = requires{sizeof(T);};

int main()
{
struct A;
static_assert(!IsComplete<A>); // ok

struct A{};
static_assert(IsComplete<A>); // error or nuclear launch.
}

[temp.names]

8 ... A concept-id evaluates to true if the concept's normalizedconstraint-expression is satisfied ([temp.constr.constr]) by thespecified template arguments and false otherwise.

[temp.constr.atomic]

3 ... If, at different points in the program, the satisfactionresult is different for identical atomic constraints and templatearguments, the program is ill-formed, no diagnostic required.


这不是什么新东西,概念只是增加了更多相同的东西。如果参数的某些属性在程序中的两个不同点不同,则模板对于特定参数集的含义不得更改。
因此,虽然可以编写检查类型是否完整的概念(即使在 C++20 之前的 SFINAE 黑客中),但不小心使用它是在玩火。

关于c++ - 为什么 C++20 的要求表达式的行为不符合预期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67658343/

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