C++VS2015 constexpr编译错误,constexpr构造函数调用constexpr成员函数
C++ VS2015 constexpr compile error with constexpr constructor call to constexpr member function
我最近下载了VS2015,并开始修补新的C++11功能。我的游戏引擎中缺少的一个功能是HashedString类。由于C++11引入了constexpr,我认为HashedString类将是一个很好的起点。
然而,我遇到了一个编译错误的路障。每当我试图从constexpr构造函数的成员初始值设定项列表中调用constexpr成员函数时,编译器都会抱怨该成员函数调用没有产生常量表达式。我甚至试图将HashString和HashStringDJB2Recursive调用简化为只返回0,但同样的编译错误仍然存在。如果我删除对HashString的调用,一切都会编译得很好。
就我所研究的而言,下面提供的成员函数并不违反C++11 constexpr规则。我可能遗漏或误解了C++constexpr规则。任何关于为什么不编译的澄清都将不胜感激!
namespace CBConstants
{
constexpr unsigned int HASHED_STRING_HASH_CONSTANT = 5381;
}
class HashedString
{
public:
~HashedString();
explicit constexpr HashedString( const char* stringToHash ) noexcept
: mStringHash( HashString( stringToHash ) ),
mStringData( stringToHash )
{
}
private:
// DJB2 Hash documentation http://www.cse.yorku.ca/~oz/hash.html
constexpr unsigned int HashedString::HashString( const char* stringToHash ) const noexcept
{
return ( ( !stringToHash ) ? 0 : HashStringDJB2Recursive( CBConstants::HASHED_STRING_HASH_CONSTANT, stringToHash ) );
}
constexpr unsigned int HashedString::HashStringDJB2Recursive( const unsigned int hashConstant, const char* stringToHash ) const noexcept
{
return ( !(*stringToHash) ? hashConstant : HashStringDJB2Recursive(((hashConstant << 5) + hashConstant) + (*stringToHash), stringToHash + 1 ) );
}
unsigned int mStringHash;
const char* mStringData;
};
编译错误:
错误C2134"HashedString::HashString":调用未产生常量表达式HashedString.h 17注意:失败是由调用未定义的函数或未声明为"constexpr"的函数引起的
您的类不是一个文字,因为您有一个非平凡的析构函数。
根据C++标准
12.4/5如果不是用户提供的,并且如果:,则析构函数是微不足道的
--析构函数不是虚拟的,
--它类的所有直接基类都有平凡的析构函数和
--对于其类中属于的所有非静态数据成员类类型(或其数组),每个此类都有一个平凡的析构函数。
否则,析构函数是不平凡的。
在您的案例中,您声明了析构函数,因此析构函数是非平凡的。如果你做
~HashedString() = default;
或者即使不声明它,代码也应该编译。
Coliru上的实时示例
编辑
VC++似乎关心函数的定义顺序。将它们移到构造函数之上将使代码可编译(尽管C++标准没有强制要求这样做)。
rextester VC++上的实时示例
- 函数调用中参数的顺序重要吗
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 变量没有改变?通过向量的函数调用
- 条件constexpr函数
- 为什么 std::get<T> 其中 T 是调用 constexpr 函数失败的结果?
- 在enable_if_t中调用 constexpr 函数
- 是否有一种非间接、非黑客的方式来保证 constexpr 函数仅在编译时可调用?
- constexpr vs重复函数调用性能
- 触发编译时间错误时,constexpr函数的超载被调用
- 为什么 gcc5.4 不编译调用非 constexpr 函数的 constexpr 函数,而 icpc 可以编译?
- 模板推导指南可以调用constexpr函数吗
- 如何在constexpr函数中有效地调用_BitScanReverse或__builtin_clz
- 为什么我可以在constexpr函数中调用一个非constexpr的函数
- 在常量表达式上下文中的定义之前嵌套的“constexpr”函数调用
- C++constexpr计数构造函数调用
- constexpr 函数可以调用返回 void 的函数吗?
- C++VS2015 constexpr编译错误,constexpr构造函数调用constexpr成员函数
- 如何确保constexpr函数在运行时永远不会被调用
- 调用非 constexpr 函数'std::map...'
- constexpr函数中的非constexpr调用