为什么具有const成员的结构可以分配?

时间:2012-02-24 05:23:02

标签: c++ c++11 typetraits

我需要使用std::is_assignable类型的特征,这些特征在我想要支持的最旧的编译器版本中不可用。因为我必须自己实现这个(好吧,我承认,有一些互联网偷看),我现在想知道这是我的实现中的错误还是std::is_assignable的一般问题。

首先,这是我的测试结构:

struct Bar {
  bool const cb; // this should kill the default assignment operator
  int i;
};

这是我的stdreplace::is_assignable

template <typename T> struct is_assignable : private std::__sfinae_types {
  private:
    template <typename T1> 
      static decltype(std::declval<T1>() = std::declval<T1>(),__one()) test(int);
    template <typename T1> 
      static __two test(...);
  public:
    static bool const value = sizeof(test<T>(0)) == sizeof(__one);
};

然而,它告诉我,Bar是可分配的:

int: 1
Bar: 1
int[2]: 0

问题出在哪里?

1 个答案:

答案 0 :(得分:3)

您的编译器可能没有正确地将赋值运算符定义为已删除。在关于隐式声明的特殊成员函数的c ++ 03代码中,未评估的操作数内的这种赋值很好,即使它在一个计算的操作数中出现时也会被赋值。原因是因为asignment运算符永远不会被隐式定义,而只是隐式声明,因此永远不会出现错误。

由于c ++ 11中的更改​​已经自动删除了赋值运算符,因此我认为您的编译器有错误。