【发布时间】:2017-04-20 21:32:33
【问题描述】:
所以显然这应该有效:
template<class T>
struct C {
using value_type = T;
C(value_type);
};
C c(1); // C<int>
就是这样(参见[over.match.class.deduct]/3 中的B 示例):
template<class T>
struct D {
template<class> using meow_t = T;
template<class U>
D(U, meow_t<U>);
};
D d(1, 'c'); // D<char>
请注意,由于参数是非推导上下文,因此看似等效的显式指南将不起作用:
template<class T>
C(typename C<T>::value_type) -> C<T>;
虽然希望至少第一个 sn-p 有效,但我还没有找到真正使其在当前有效的措辞工作草案。有谁知道它在哪里?
【问题讨论】:
-
无关:
d(1, 'c')不应该吐出类似于deduced conflicting types for parameter 'T' ('int' and 'char')的错误吗?或者这里meow_t<U>是在非推断上下文中?但如果是,那么代码中的注释是错误的,// D<char>应该是// D<int>。 -
没有。
meow_t<U>是T。 -
对,我就是这么想的。但是在
d(1, 'c')中,你有一个int和一个char。为什么类型扣除会在这里起作用,因为(afaik)没有执行转换?例如,这个 C++1z 之前的示例无法编译:coliru.stacked-crooked.com/a/f57c46020edd62fd -
再看一遍,是
T,不是U。 -
哦,是的,谢谢,我的错!
标签: c++ language-lawyer c++17