C++ 成员类模板的类模板参数推导
考虑以下几点C++ 成员类模板的类模板参数推导,c++,templates,c++17,C++,Templates,C++17,考虑以下几点 template <typename T1> struct OuterFoo { template <typename T2> struct InnerFoo { InnerFoo(T2 v2) {} }; explicit OuterFoo(T1 v1) {} }; int main() { OuterFoo outer_foo{6}; OuterFoo<int>::InnerFoo inner_foo{3
template <typename T1>
struct OuterFoo {
template <typename T2>
struct InnerFoo {
InnerFoo(T2 v2) {}
};
explicit OuterFoo(T1 v1) {}
};
int main() {
OuterFoo outer_foo{6};
OuterFoo<int>::InnerFoo inner_foo{3};
return 0;
}
模板
结构OuterFoo{
模板
结构InnerFoo{
InnerFoo(t2v2){}
};
显式OuterFoo(T1 v1){}
};
int main(){
外福外福{6};
OuterFoo::InnerFoo-inner_-foo{3};
返回0;
}
clang拒绝编译这篇文章,声称“没有可行的构造函数或演绎指南来演绎‘InnerFoo’的模板参数”——另一方面,Gcc编译时没有问题
所提供的示例是否正确(按照标准)使用CTAD,这里的clang是否有错
如果提供了扣减指南,clang可以编译,但gcc不接受该指南:
模板
结构OuterFoo{
模板
结构InnerFoo{
InnerFoo(t2v2){}
};
//clang 6中需要此模板扣减指南
//对于要编译的示例。
//GCC编译时没有此TDG,但报告错误
//用它
//“扣除指南'OuterFoo::InnerFoo(T2)->OuterFoo::InnerFoo'
//必须在命名空间范围中声明“
模板InnerFoo(t2v2)->InnerFoo;
//…但OuterFoo不需要TDG
显式OuterFoo(T1 v1){}
};
int main(){
外福外福{6};
OuterFoo::InnerFoo-inner_-foo{3};
返回0;
}
clang和gcc中成员模板类的CTAD状态如何?现在还没有吗
clang和gcc中成员模板类的CTAD状态如何?现在还没有吗
根据,CTAD可用于版本7和更高版本
根据,CTAD可用于版本7和更高版本
但是,请注意,在这些实现的后续版本中已经报告并解决了一些缺陷。一个随机的问题:为什么人们仍然使用模板而不是
auto
?
template <typename T1>
struct OuterFoo {
template <typename T2>
struct InnerFoo {
InnerFoo(T2 v2) {}
};
// This Template Deduction Guide is required in clang 6
// for the example to compile.
// GCC compiles without this TDG but reports an error
// with it
// "deduction guide ‘OuterFoo<T1>::InnerFoo(T2) -> OuterFoo<T1>::InnerFoo<T2>’
// must be declared at namespace scope"
template<typename T2> InnerFoo(T2 v2) -> InnerFoo<T2>;
// ...but no TDG is required for OuterFoo
explicit OuterFoo(T1 v1) {}
};
int main() {
OuterFoo outer_foo{6};
OuterFoo<int>::InnerFoo inner_foo{3};
return 0;
}