考慮下面的代碼:推導引導和可變參數模板
#include <tuple>
#include <iostream>
template <class T>
struct custom_wrapper
{
template <class Arg>
custom_wrapper(Arg arg): data(arg) {}
T data;
};
template <class Arg>
custom_wrapper(Arg arg) -> custom_wrapper<Arg>;
template <class... T>
struct custom_tuple
{
template <class... Args>
custom_tuple(Args... args): data(args...) {}
std::tuple<T...> data;
};
template <class... Args>
custom_tuple(Args... args) -> custom_tuple<Args...>;
int main(int argc, char* argv[])
{
custom_wrapper<int> w1(42); // OK
custom_wrapper w2(42); // OK
custom_tuple<int> t1(42); // OK
custom_tuple t2(42); // Fails
return 0;
}
失敗下克++ 7返回以下錯誤的行:
variadic_deduction_guide.cpp: In instantiation of 'custom_tuple<T>::custom_tuple(Args ...) [with Args = {int}; T = {}]':
variadic_deduction_guide.cpp:31:23: required from here
variadic_deduction_guide.cpp:19:45: error: no matching function for call to 'std::tuple<>::tuple(int&)'
custom_tuple(Args... args): data(args...) {}
是正常或是編譯器故障?
嗯,海灣合作委員會和鏗鏘樹幹不同意OP的代碼,我不是很確信這裏。首先是'T'「尾隨」? (這是一個相當不明確的術語。)其次,你能證明構造函數比扣除指南更專業嗎? –
@ T.C。但很酷,看到克朗與扣除指南工作!這一定是相當新的。 – Barry
這裏的上下文是一個函數調用,所以[「所使用的類型\ [對於偏序} \是那些函數調用具有參數的函數參數類型]](https://timsong-cpp.github.io/cppwp /temp.deduct.partial#3.1)。對於部分排序目的,[「一個模板參數可能保留沒有值,只要它不用於用於部分排序的類型」](https://timsong-cpp.github.io/cppwp/temp.deduct。部分#12),而'T ...'不是。那麼究竟如何比其他更專業?扣除失敗的方向如何? –