gpt4 book ai didi

c++ - static_assert 是否需要使用模板参数?

转载 作者:行者123 更新时间:2023-11-30 02:42:49 30 4
gpt4 key购买 nike

我试图禁止对我已有的类的引用,但我看到了一些奇怪的行为。我已经构建了一个玩具示例来展示正在发生的事情。如果我有这个:

template <class T>
struct something {
};

template <class T>
struct something<T&> {
static_assert(false, "reference disallowed with something");
};


int main() {
something<int> a; (void)a;
}

即使我没有声明带有引用的实例,它仍然失败:

> g++ -std=c++11 foo.cc -o foo
foo.cc:7:5: error: static assertion failed: reference disallowed with something
static_assert(false, "reference disallowed with something");
^

如果我调整它以便它必须通过代理类使用模板参数,那么它就可以工作:

template <class T>
struct something {
};

template <class T>
struct something<T&> {
template <class TT> struct falsity {
static const bool value = false;
};
static_assert(falsity<T>::value, "reference disallowed with something");
};

int main() {
something<int> a; (void)a;
}

然后一切正常,这是预期的行为吗?我原以为静态断言无论如何都会是该类的成员。

编辑:这是 gcc 版本 4.8.2 (Ubuntu 4.8.2-19ubuntu1)

最佳答案

您的 static_assert 不依赖于任何模板参数,因此编译器不必等到类模板实例化时才评估语句。相反,它在 two phase name lookup 的第一阶段这样做并且您的代码无法编译。

在您的情况下,您可以通过将断言更改为来修复失败

static_assert(!std::is_lvalue_reference<T>::value, "reference disallowed with something");

关于c++ - static_assert 是否需要使用模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26726321/

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