2015-11-30 39 views
3

這是一個在C++ 03(-std = C++ 03)上工作但在GCC和VS2015上對C++ 11失敗的示例(-std = C++ 11,/ Qstd = C++ 11)即使V(U)有效,std :: pair <T, U>轉換爲std :: pair <T, V>也不起作用?

#include <utility> 

class B { 
public: 
    B(float); 
}; 

class A { 
public: 
    A(B); 
}; 

std::pair<int, A> a(std::make_pair(1, 2.0)); 

我不知道爲什麼,這將是無效的..據我所看到的,在http://en.cppreference.com/w/cpp/utility/pair/pair描述的A成員都是直接由初始化float。是否有隱式可轉換性的SFINAE測試?據我所知,在cppreference上它沒有提到任何類似的東西。

+0

我很困惑,你爲什麼期望編譯器在沒有轉換的情況下應該經歷兩次轉換? – Mehrdad

+0

@Mehrdad如果'pair :: pair(po):f(po.f),s(po.s)',那麼沒有兩次轉換。 –

+0

我不明白,是不是'2.0'是'雙'?它需要被轉換爲'float',在需要轉換爲'B'之前可以轉換爲'A'。這似乎需要至少2轉換,如果不是3 ... – Mehrdad

回答

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 &可隱式轉換爲first_type並且const V &是 可以隱式轉換爲second_type。

所以,GCC /鐺/ MSVC是正確的,這個代碼不應該編譯,因爲double不是隱式轉換爲A

+0

'is_constructible'似乎被定義爲測試是否「T obj(std :: declval ()...);」是格式良好的。 'a(2.0)'是格式良好的,所以is_constructible不是真的,轉換成功了嗎? –

+0

其他精簡版是專注於。謝謝! –

相關問題