的reference_wrapper和隐式转换
考虑下面的代码:的reference_wrapper和隐式转换
int v = 12;
std::reference_wrapper<int> x(v);
std::reference_wrapper<const int> y(x); // (1) This works
std::reference_wrapper<const int> z = x; // (2) This fails
如果正确地明白(1)的工作,因为它仅需要一个单一的用户转换,(2),因为它涉及在两个用户的转换失败转换序列:
std::reference_wrapper<int>::operator int& and
std::reference_wrapper<const int>::(const int&)
因此,std::reference_wrapper<int>
不隐式转换到std::reference_wrapper<const int>
,打破我的一些代码,我使用std::is_convertible
特质。
有什么理由这个设计包括一个通用的拷贝构造函数的不存在:
template <typename Y>
reference_wrapper<T>::reference_wrapper(const reference_wrapper<Y>&)
(就像在std::shared_ptr
为例),将允许这样的隐式转换?
std::reference_wrapper
与其基础类型之间没有隐式自动转换(因为它可能是不安全和令人困惑的)。
正确的语法应为:
std::reference_wrapper<const int> z = x.get();
[是的,隐式转换来自std :: reference_wrapper
@Xeo:我们是否需要它在这个表达式的某处:''std :: reference_wrapper
不管原因,你应该总是解开'reference_wrapper's如果你期待他们。 – Xeo 2013-05-06 09:48:48
@Xeo这完全相反,我将一个UnaryFunction的reference_wrapper作为模板类的参数传递,该模板类需要UnaryFunction。更确切地说: 'typedef boost :: transform_iterator> iterator' 'typedef boost :: transform_iterator > const_iterator' 我期望'iterator'将_implicitely convertible_转换为'const_iterator'。 –
2013-05-06 11:33:26
在C++中,相同基本类型的不同专业化无关,无论实例化类型具有哪种关系。 'std :: reference_wrapper'与'std :: reference_wrapper '没有多大关系,而是'std :: reference_wrapper <:string>'。虽然你可能会希望他们是可转换的,但我不会说你应该期望它是可以转换的。 –
2013-05-06 12:43:45