我这里有一个函数可能是constexpr的情况。通常,只有在上下文允许的情况下,才添加constexpr并使用常量评估。但是,以下代码尽管没有在constexpr上下文中使用它,但仍会抱怨:
template <typename T>
struct Wrapper
{
friend constexpr bool operator==(const Wrapper& crLhs, const Wrapper& crRhs) noexcept
{
return crLhs.m_t == crRhs.m_t;
}
T m_t = {};
};
例如,使用Visual Studio 2017 15.9.20,这会导致“错误C3615:constexpr函数'operator =='无法导致常量表达式”。为std :: string实例化。该信息是正确的,但我not在constexpr上下文中实例化它。
void f()
{
bool b;
Wrapper<int> a;
b = a == a; //ok
Wrapper<std::string> c;
b = c == c; //C3615, but not using constexpr context
}
我可以通过使用成员模板来应用变通方法,或者删除constexpr,但是这里有没有花哨的技巧可以兼得两者(例如,constexpr适用)?
此错误已在MSVC版本19.22中修复,并且可以正确编译。在这里,我们可以看到两个编译器版本的并排:https://godbolt.org/z/79kXFm
19.22之后的所有版本(包括19.22)都将对其进行编译,但是19.21及以下版本错误地为您提供了错误C3615,即使它们都设置为使用C ++ 11。
该错误仅存在于MSVC中,甚至非常老版本的GCC和Clang都可以编译代码而不会给您带来错误。
[如果可能的话,您应该仅移至Visual Studio的较新版本。这是升级编译器的最简单的选择,如果您升级到较新的版本,则编译器应该会收到错误修复和升级。如果那不是一个选择,我会用谷歌搜索以不同的方式来升级编译器本身。这个might be helpful。