У меня есть случай, когда функция потенциально может быть 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. Информация верна, но я не создаю ее экземпляр в контексте 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, когда это применимо)?