static_assert无法正常工作

时间:2013-11-03 19:20:30

标签: c++ c++11 static-assert

我的类有一个重载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;
}

有关正在运行的示例,请参阅here

3 个答案:

答案 0 :(得分:4)

当然断言失败了。您要求类型T是指针,但T这里是int

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

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

断言是确保特定条件的陈述。它不完全&#34;如果X然后输出错误消息Y&#34 ;;事实上,它恰恰相反。 :)

答案 1 :(得分:1)

您断言传递的类型是指针。如果您传递的内容 not 指针,则static_assert()会失败并收到消息。看来,你想要正确地否定条件想要使用指针:

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

答案 2 :(得分:0)

当且仅当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
  }
};