2012-02-24 54 views
2

我需要使用std::is_assignable类型特征,这种特征在我想支持的最老的编译器版本中不可用。由于我必须自己实现(好吧,我承认它,有一些interwebs偷看),我现在想知道这是我的实现中的错误还是std::is_assignable的一般问题。为什么具有const成员的结构可赋值?

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

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 

哪里有问题?

+0

你有没有尝试改变你的布尔变量名称是别的而不是保留关键字? – 2012-02-24 05:26:13

+0

@pwny:哦,男孩。这是在问题*中的拼写错误*,因为我手工输入了“Bar”结构。我纠正了这个问题,**谢谢**! – bitmask 2012-02-24 05:29:02

+0

呵呵所有的好处我只是确保这不是一个奇怪的编译器技巧,因为这个。 – 2012-02-24 05:31:22

回答

3

您的编译器可能未正确定义为已删除的赋值运算符。在关于隐式声明的特殊成员函数的C++ 03代码中,即使赋值在评估操作数中出现时的分配格式不正确,在未评估操作数内的分配也可以。其原因是因为调度操作符永远不会被隐式定义,而只会被隐式声明,从而不会产生错误。

由于在C++ 11中进行了更改,并且您的赋值运算符应该被自动删除,所以在我看来您的编译器有问题。

+0

我明白了。我同样怀疑,因为进一步的调查和不同的尝试让人感觉不如以前,感谢您的确认。我会提交一份错误报告,但显然它已经在更新版本中修复了。 – bitmask 2012-02-24 09:21:13

相关问题