0

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

例子

4

3 回答 3

4

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

也许您的意思是以下?

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

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

于 2013-11-03T19:24:40.990 回答
2

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

static_assert(!std::is_pointer<T>::value, "no operator overloaded for pointers.");
于 2013-11-03T19:23:19.090 回答
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
  }
};
于 2013-11-03T19:27:35.390 回答