为什么我的表达式不是模板中的常量表达式?

时间:2019-07-23 16:14:53

标签: c++ templates c++17 constexpr

我有一个constexpr函数,

template<class T, class U>
constexpr bool equal(T&& t, U&& u){
    return std::addressof(t) == std::addressof(u);
}

现在,如果我将其称为main。它可以按预期工作,equal的行为就像constexpr一样,可以产生常量表达式。

struct bar_t{
    unsigned _tmp;
};

int main(){
    bar_t a{25}, b{32};
    static_assert(equal(a, a)); // Ok Passes;
    static_assert(equal(a, b)); // Ok Fails;
}

现在在模板函数中使该静态断言时生效。像这样:

template <class X>
auto Foo(X&& a, X&& b){
    static_assert(equal(a,b)); // Not constant Expression
    // This line says that equal is not constexpr
}

现在这是我的问题:

  • 为什么在一个地方是constexpr,而在另一个地方却不是呢?

  • 如何使它在任何地方都成为常量表达式?

0 个答案:

没有答案