条件constexpr函数

问题描述 投票:1回答:1

我这里有一个函数可能是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适用)?

c++ c++11 constexpr
1个回答
1
投票

您的代码很好。这是旧版MSVC中的错误。

此错误已在MSVC版本19.22中修复,并且可以正确编译。在这里,我们可以看到两个编译器版本的并排:https://godbolt.org/z/79kXFm

19.22之后的所有版本(包括19.22)都将对其进行编译,但是19.21及以下版本错误地为您提供了错误C3615,即使它们都设置为使用C ++ 11。

GCC和Clang从未有此错误。

该错误仅存在于MSVC中,甚至非常老版本的GCC和Clang都可以编译代码而不会给您带来错误。

您应该怎么做?

[如果可能的话,您应该仅移至Visual Studio的较新版本。这是升级编译器的最简单的选择,如果您升级到较新的版本,则编译器应该会收到错误修复和升级。如果那不是一个选择,我会用谷歌搜索以不同的方式来升级编译器本身。这个might be helpful

© www.soinside.com 2019 - 2024. All rights reserved.