【问题标题】:static_assert unexpected behaviorstatic_assert 意外行为
【发布时间】:2013-11-03 19:20:29
【问题描述】:

我的类有一个重载的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 &lt;&lt; "is_pointer : " &lt;&lt; std::is_pointer&lt;T&gt;::value &lt;&lt; std::endl; 正在打印一个零...

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

Example.

【问题讨论】:

  • 打印布尔值的快速提示:std::cout &lt;&lt; std::boolalpha;,然后再执行。

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


【解决方案1】:

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

也许您的意思是以下?

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • I can't comment, so I have to answer instead. 实际上的目的是在您获得所需的代表之前,您不要评论根本,而不是违反规则并找到任何旧的不合适的地方发表你的话。不过我会放过你,因为这是一个很好的答案,实际上是一个答案。 :)
      猜你喜欢
      • 2017-03-10
      • 2019-05-01
      • 2011-07-15
      • 2011-04-27
      • 2019-12-07
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多