gpt4 book ai didi

c++ - 为什么模板中的 static_assert 使用等效表达式会给我不同的结果?

转载 作者:太空狗 更新时间:2023-10-29 20:12:25 25 4
gpt4 key购买 nike

我注意到 static_assert 的奇怪行为:

#include <iostream>

template <typename T, unsigned int D> struct Vec
{
static_assert(D && 0, "Invalid dimension for vector!");
};

template <typename T> struct Vec<T, 1> {union {T x, r;};};
template <typename T> struct Vec<T, 2> : Vec<T, 1> {union {T y, g;};};
template <typename T> struct Vec<T, 3> : Vec<T, 2> {union {T z, b;};};
template <typename T> struct Vec<T, 4> : Vec<T, 3> {union {T w, a;};};

int main()
{
Vec<float, 3> v;
v.x = 1;
v.y = 2;
v.z = 3;

return 0;
}

它编译得很好:http://ideone.com/wHbJYP .我希望

static_assert(0, "Invalid dimension for vector!");

给我相同的结果,但它会导致静态断言失败:http://ideone.com/UEu9Kv .gcc 在这两种情况下都正确吗?如果是这样,为什么?或者它是一个 gcc 错误?那么gcc在什么情况下是正确的呢?

最佳答案

§14.6 [temp.res]/p8:

If no valid specialization can be generated for a template, and that template is not instantiated, the template is ill-formed, no diagnostic required.

在这两种情况下,由于 static_assert(无论 D 的值如何,D && 0 永远不会为真,因此无法为主模板生成有效的特化)。由于不需要诊断,因此编译器可以自由诊断一个(当您使用 0 时)而不是另一个(当您使用 D && 0 时)。

解决方法:

template <unsigned int D> struct always_false : std::false_type {};

template <typename T, unsigned int D> struct Vec
{
static_assert(always_false<D>::value, "Invalid dimension for vector!");
};

编译器不能再在定义时拒绝它,因为可能存在 always_false 的显式特化,其 value 成员为 true

关于c++ - 为什么模板中的 static_assert 使用等效表达式会给我不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27867949/

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