Templates 为什么使用可变模板参数初始化我的对象需要定义移动构造函数?
我想在模板函数中创建一些Templates 为什么使用可变模板参数初始化我的对象需要定义移动构造函数?,templates,c++11,g++,clang,variadic-templates,Templates,C++11,G++,Clang,Variadic Templates,我想在模板函数中创建一些typenameType的本地对象: template <typename Type, typename... Args> void create_local(Args... args) { Type val(args...); } g++(从4.7.3到5.2)无法编译,需要定义T的move构造函数?Clang3.7编译成功 此外,如果我(1)从T中删除std::mutex成员,(2)为T声明默认构造函数,以及(3)为T声明已删除的副本构造函数:
typename
Type
的本地对象:
template <typename Type, typename... Args>
void create_local(Args... args)
{
Type val(args...);
}
g++(从4.7.3到5.2)无法编译,需要定义T的move构造函数?Clang3.7编译成功
此外,如果我(1)从T中删除std::mutex
成员,(2)为T声明默认构造函数,以及(3)为T声明已删除的副本构造函数:
struct T {
T() = default;
T(const T&) = delete;
};
int main()
{
T t; // OK: No use of move constructor
create_local<T>(); // OK: No use of move constructor
}
struct{
T()=默认值;
T(常数T&)=删除;
};
int main()
{
T;//确定:不使用移动构造函数
create_local();//确定:不使用移动构造函数
}
g++和clang的所有版本都已成功编译。为什么g++不为任何类型编译带有不可复制成员的
type
?根据Andrey Zholos在bug报告中的评论:
我也偶然发现了这个bug,bug 59141是一个复制品
空参数包似乎扩展为t({}),而不是t()
14.5.3p6中有一个类似的例子,指出obj应该初始化值(而不是复制构造),clang接受此代码
嗯,好像是个虫子。有趣的是,如果在初始化时使用大括号而不是括号,g++将编译上述代码,
struct T {
T() = default;
T(const T&) = delete;
};
int main()
{
T t; // OK: No use of move constructor
create_local<T>(); // OK: No use of move constructor
}