c++ - 可变参数模板和复制构造函数

标签 c++ c++11 visual-studio-2013

为什么以下不编译:

struct a
{
    int i;
};


template <typename T>
class b
{
public:
    T mItem;


    template <typename... Arguments>
    b(Arguments&&... args) : mItem(std::forward<Arguments>(args)...)
    {
    }
};


int _tmain(int argc, _TCHAR* argv[])
{
    b<a>(1);

    return 0;
}

error C2664: 'a::a(const a &)' : cannot convert argument 1 from 'int' to 'const a &'

但是只需像这样添加一个额外的参数就可以编译:

struct a
{
    int i;
};


template <typename T>
class b
{
public:
    T mItem;


    template <typename... Arguments>
    // just random extra argument
    b(int, Arguments&&... args) : mItem(std::forward<Arguments>(args)...)
    {
    }
};


int _tmain(int argc, _TCHAR* argv[])
{
    b<a>(1);

    return 0;
}

有没有比简单地向 b 的构造函数添加一个额外的(无用的)参数更简洁的方法?

最佳答案

你试图依赖聚合初始化,但你需要使用大括号而不是圆括号来使用它:

template <typename... Arguments>
b(Arguments&&... args) : mItem{std::forward<Arguments>(args)...}
{
}

大括号表示您正在使用列表初始化而不是值/直接初始化。当 T 是聚合类型时,前者解析为聚合初始化,但后两者不是。是的,C++ 初始化规则很奇怪。

关于c++ - 可变参数模板和复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32784525/

相关文章:

iis - VS Express 2013 for Web : How to use the internal VS server, 不是 IIS express?

visual-studio-2012 - SSDT BI for Visual Studio 2013 是否可以与 SQL Server 2012 一起使用?

c++ - 有条件地包含/排除类模板内的数据成员

sql-server - 如何使用开发人员计算机连接到 Azure VM SQL Server Analysis Service 实例

c++ - 如何获取我当前正在使用 Clang 访问的文件的名称?

c++ - 如果大括号闭合列表的类构造函数大小错误,则编译时错误

c++ - 类中的unique_ptr如何使用它们

c++ - 如何向类添加方法(辅助函数)?

c# - 在 visual studio 2013 中设置发布项目

c++ - 为什么我的 opengl freeglut 应用程序编译为 C 而不是 C++?