gcc 8.0.0和clang 5.0.0不同意這個程序的行爲:的轉發參考,並扣除正常參考部分訂購指南
#include <iostream>
template <typename T>
struct A {
A(const T&) { std::cout << __PRETTY_FUNCTION__ << '\n'; }
A(T&&) { std::cout << __PRETTY_FUNCTION__ << '\n'; }
};
template <typename U> A(U&&) -> A<double>;
int main() {
int i = 0;
const int ci = 0;
A a1(0); // both say A<double>
A a2(i); // both say A<double>
A a3(ci); // gcc says A<int>, clang says A<double>
}
GCC的行爲沒有任何意義,我 - 如果const T&
超載最好的U&&
過載爲左值const int
,爲什麼不是T&&
過載首選到U&&
過載對於右值int
?鏗鏘聲對我來說更有意義(沒有一個功能比其他功能更專業,所以演繹指南獲勝)。
誰是對的?
我會對此進行一次刺探。扣除是針對一個右值(參考)。 'ci'是'const'的左值,碰巧有一個構造函數將'const'的引用作爲參數。 –
請原諒我缺乏的知識,但是這個' - >'語法是如何調用的? – HolyBlackCat