【发布时间】:2016-12-07 01:49:37
【问题描述】:
考虑下面粘贴的代码。我已经定义了一个非常简单的类,编译器为其生成一个隐式推导指南,因此它可以在没有显式模板参数的情况下构造。但是,模板参数推导不适用于从仅直接转发到目标类的简单别名模板构造对象:
template< typename A, typename B >
struct Foo {
Foo( A const &a, B const &b )
: a_(a), b_(b)
{ }
A a_;
B b_;
};
template< typename A, typename B >
using Bar = Foo<A, B>;
auto foobar() {
Foo r{1, 2};
Bar s{3, 4};
// ../src/geo/vector_test_unit.cpp: In function 'auto foobar()':
// ../src/geo/vector_test_unit.cpp:16:6: error: missing template arguments before 's'
// Bar s{3, 4};
// ^
return 1;
}
从上面的代码注释中可以看出,g++ 给我一个关于使用没有模板参数的别名模板的错误。我希望在这种情况下可以转发模板参数推导。
那么,我的问题:这是对类模板参数推导提案的当前措辞的明确设计吗?或者这是该功能的当前 g++ 实现中未完成的功能或错误?对于提案的作者或 C++ ISO 委员会来说,这将是一个更大的问题,但如果他们中的任何人看到这一点:是否希望该功能的最终措辞包括启用这样的别名模板也是否为他们生成了隐式指南?
我可以理解,由于别名模板可以有任何类型的模板参数,编译器可能并不总是能够成功推导出目标类模板参数,但在这种情况下,我希望编译器能够以与直接为目标类相同的方式。
几天前,我正在使用 --std=c++1z 从 head 构建的 gcc 进行构建。完整版本信息为:gcc version 7.0.0 20161201 (experimental) (Homebrew gcc HEAD- --with-jit)
【问题讨论】: