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 に答える