的reference_wrapper和隐式转换

的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为例),将允许这样的隐式转换?

+0

不管原因,你应该总是解开'reference_wrapper's如果你期待他们。 – Xeo 2013-05-06 09:48:48

+0

@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

+2

在C++中,相同基本类型的不同专业化无关,无论实例化类型具有哪种关系。 'std :: reference_wrapper '与'std :: reference_wrapper '没有多大关系,而是'std :: reference_wrapper <:string>'。虽然你可能会希望他们是可转换的,但我不会说你应该期望它是可以转换的。 – 2013-05-06 12:43:45

std::reference_wrapper与其基础类型之间没有隐式自动转换(因为它可能是不安全和令人困惑的)。

正确的语法应为:

std::reference_wrapper<const int> z = x.get(); 
+0

[是的,隐式转换来自std :: reference_wrapper - > T&'。](http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper/get) – Xeo 2013-09-11 12:19:58

+0

@Xeo:我们是否需要它在这个表达式的某处:''std :: reference_wrapper z = x;''? – 2013-09-11 12:22:17