我有以下代码:
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++
有点帮助。除了指出参数 tonoexcept
必须是常量表达式的错误消息外,它还说:
note: undefined function 'foo' cannot be used in a constant expression
note: declared here
static constexpr bool foo() { return true; }
^
那么......这是一个两遍编译问题吗?编译器是否试图在定义类中的所有成员函数之前声明它们的问题?(请注意,在类的上下文之外,编译器都不会抛出错误。)这让我感到惊讶;直观地说,我看不出有任何理由让static constexpr
成员函数不能在类内部或外部的任何和所有常量表达式中使用。