C++VS2015 constexpr编译错误,constexpr构造函数调用constexpr成员函数

C++ VS2015 constexpr compile error with constexpr constructor call to constexpr member function

本文关键字:constexpr 函数调用 成员 函数 编译 错误 C++VS2015      更新时间:2023-10-16

我最近下载了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++上的实时示例