【发布时间】:2020-06-09 11:05:15
【问题描述】:
我在这里有一个函数可能是 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 function 'operator ==' cannot result in a constant expression”,例如为 std::string 实例化。信息是正确的,但我没有在 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)?
【问题讨论】:
-
constexpr并不意味着它是在编译时评估的(正如您已经知道的那样),但它确实意味着它必须可以在编译时评估它 -
@idclev:我知道,它可能会在编译时针对某些类型进行评估。因此 constexpr。只是不适用于其他类型。 constepxr 很酷,您也可以在非 constexpr 上下文中调用它。但如果在上述情况下弹出此错误,则不会。
-
如果你知道它,那么为什么在 constexpr 上下文中不使用/实例化它很重要?无论如何,它不会改变实际的问题。
-
@idclev:这是一个简化的案例。它是一种包装器;有时用于内置类型;有时用于更复杂的类型。对于内置类型,我们使用相等运算符的 constexpr 评估。