我有一个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,而在另一个地方却不是呢?
如何使它在任何地方都成为常量表达式?