Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates 为什么使用可变模板参数初始化我的对象需要定义移动构造函数?_Templates_C++11_G++_Clang_Variadic Templates - Fatal编程技术网

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
}