跑進模板扣除導遊另一怪事後C++17 template deduction guide not used for empty parameter set?(即錯誤https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81486仍然沒有固定在樹幹GCC不幸的是:():C++ 17模板演繹指南不適用於空參數集(版本2)?
#include <utility>
template <class T> struct success
{
T value;
constexpr success(T &&v)
: value(std::move(v))
{
}
constexpr success(const T &v)
: value(v)
{
}
};
template <> struct success<void>
{
};
template <class T> success(T /*unused*/)->success<T>;
success()->success<void>;
template<class T> struct foo
{
foo(success<void>) {}
};
int main(void)
{
auto a = success{5}; // works
auto b = success{}; // works
auto c = success{"hello"}; // works
auto d = success(5); // works
//auto e = success(); // FAILS on GCC 7.2!
auto f = success("hello"); // works
foo<void> g(success()); // FAILS
static_assert(std::is_same<decltype(a), success<int>>::value, "");
static_assert(std::is_same<decltype(b), success<void>>::value, "");
static_assert(std::is_same<decltype(c), success<const char *>>::value, "");
static_assert(std::is_same<decltype(d), success<int>>::value, "");
//static_assert(std::is_same<decltype(e), success<void>>::value, "");
static_assert(std::is_same<decltype(f), success<const char *>>::value, "");
return 0;
}
令人驚訝的線,至少對我來說,是foo<void> g(success());
無法使用兩個鐺6.0幹線和GCC 7樹幹模板扣除指南,你可以在https://godbolt.org/g/7m1Zhk
看到我覺得這令人驚訝,而不是人們所期望的是什麼。模板嚮導說,安縵success()
應被理解爲success<void>
。這應該foo的unambi工作得很好guous構造函數接受success<void>
。相反鐺6.0主幹報道:
34 : <source>:34:17: error: use of class template 'success' requires template arguments; argument deduction not allowed in function return type
foo<void> g(success()); // FAILS
^~~~~~~
3 : <source>:3:27: note: template is declared here
template <class T> struct success
^
和GCC 7.3主幹報道:
<source>: In function 'int main()':
34 : <source>:34:25: error: 'auto' parameter not permitted in this context
foo<void> g(success()); // FAILS
^
任何人能解釋這到底是怎麼回事呢?這是C++ 17標準中的缺陷嗎?
那個叮鐺聲的信息其實是[bug 34091](http://llvm.org/pr34091)。 – Rakete1111
好的,謝謝你對原因的確認。很難在這個和其他答案之間做出選擇,兩者都很好,但這個也有一個解決方法,所以我認爲它更好。 –