static_assert意外行为

static_assert unexpected behavior

本文关键字:意外 assert static      更新时间:2023-10-16

我的类有一个重载operator&,如果参数是指针,我会执行静态断言。

class test {
public:
  template<typename T>
  friend inline test& operator&(test& so, T const& t) {
    std::cout << "is_pointer : " << std::is_pointer<T>::value << std::endl;
    static_assert(std::is_pointer<T>::value, "no operator overloaded for pointers.");
    
    // some stuff
  }
};

如果我使用此运算符,即使该类型绝对不是指针,我也总是得到断言。 std::cout << "is_pointer : " << std::is_pointer<T>::value << std::endl;正在打印零...

int main() {
  test t;
  t & 123;
  return 0;
}

例。

当然,断言失败了。您要求类型 T 是指针,但此处T是一个int

也许你的意思是以下几点?

// Ensure that `T` is not a pointer
static_assert(!std::is_pointer<T>::value, "no operator overloaded for pointers");

断言是确保特定条件的语句。它不完全是"如果 X 则输出错误消息 Y";事实上,情况恰恰相反。:)

您断言传递的类型是一个指针。如果您传递的内容不是指针,则static_assert()失败并收到一条消息。似乎,您想精确地否定条件,因为您不想使用指针:

static_assert(!std::is_pointer<T>::value, "no operator overloaded for pointers.");

听起来您希望当且仅当T不是指针时才编译它。 在您的原始表达式中,您断言T是一个指针。

基本上,static_assert的意思是,"我的第一个参数最好是真的,否则我会在编译时抱怨第二个参数作为错误消息。

你似乎想要什么:

class test {
public:
  template<typename T>
  friend inline test& operator&(test& so, T const& t) {
    static_assert(! std::is_pointer<T>::value, "no operator overloaded for pointers.");
    // some stuff
  }
};