【发布时间】:2015-06-15 13:40:45
【问题描述】:
我有以下代码:
class MyClass
{
static constexpr bool foo() { return true; }
void bar() noexcept(foo()) { }
};
我希望因为 foo() 是一个 static constexpr 函数,并且因为它是在声明 bar 之前定义的,所以这是完全可以接受的。
但是,g++ 给了我以下错误:
error: ‘static constexpr bool MyClass::foo()’ called in a constant expression
这...没什么用,因为在常量表达式中调用函数的能力是constexpr的全部要点。
clang++ 更有帮助。除了指出noexcept 的参数必须是常量表达式的错误消息外,它还显示:
note: undefined function 'foo' cannot be used in a constant expression
note: declared here
static constexpr bool foo() { return true; }
^
那么...这是一个两遍编译问题吗?编译器是否试图在定义类中的所有成员函数之前声明它们的问题? (请注意,在类的上下文之外,编译器都不会抛出错误。)这让我感到惊讶;直观地说,我认为static constexpr 成员函数不能在任何和所有常量表达式中使用,无论是在类内部还是外部。
【问题讨论】:
-
@MattMcNabb 但是
bar的主体在您的示例中使用它的noexcept表达式之前没有完整,因此没有不一致。 -
@T.C.我对你找到这些宝石的能力感到困惑。你应该写一个答案,因为这是非常不明显的。
-
来自 T.C. 的链接假设标准说在类声明完成之前不能引用 constexpr (})。
-
@KyleStrand 也许我的例子不是很好。但目前不依赖于定义了哪些订单函数;或者它们在类中声明的顺序。您的提议将介绍这一点,这可能是一罐蠕虫。 CWG 1255 中的
auto示例说明了其中一个问题。
标签: c++ c++11 constexpr noexcept constant-expression