这是一个适用于C ++ 03(-std = c ++ 03)但在GCC和VS2015 for C ++ 11上失败的示例(-std = c ++ 11,/ Qstd = c ++ 11)
#include <utility>
class B {
public:
B(float);
};
class A {
public:
A(B);
};
std::pair<int, A> a(std::make_pair(1, 2.0));
我不知道为什么这会无效......据我所见,A
成员由float
直接初始化,如http://en.cppreference.com/w/cpp/utility/pair/pair所述。隐性可兑换是否有SFINAE测试?据我所知,在cppreference上它并没有提到类似的东西。
答案 0 :(得分:4)
N3337 20.3
构造
template<class U, class V> pair(const pair<U, V>& p);
Requires: is_constructible<first_type, const U&>::value is true and
is_constructible<sec- ond_type, const V&>::value is true.
这是对此构造函数的调用,因为make_pair
将返回pair<int, double>
,实际上还有另一个前提条件:
此构造函数不应参与重载决策,除非 const U&amp;可隐式转换为first_type和const V&amp;是 隐式转换为second_type。
因此,gcc / clang / msvc是正确的,不应编译此代码,因为double
不能隐式转换为A
。