繁体   English   中英

可变参数模板和通过赋值构造副本

[英]Variadic templates and copy construction via assignment

考虑以下最小示例:

template <typename T, typename U>
struct foo {};

template <template <typename...> class Bar>
struct converter
{
     template <typename... Args>
     converter(const Bar<Args...> &);
};

int main()
{
    converter<foo> c(foo<int,double>()); // This works.
    // converter<foo> c = foo<int,double>(); This fails
}

在GCC 4.5和4.6中,注释掉的行均失败,并显示以下消息:

main.cpp:10:2: error: wrong number of template arguments (1, should be 2)
main.cpp:4:8: error: provided for template<class T, class U> struct foo
main.cpp: In function int main():
main.cpp:15:37: error: conversion from foo<int, double> to non-scalar type converter<foo> requested

如果不是使用可变参数模板,而是使用特定数量的模板参数(在这种情况下为2),则没有错误。 我有点困惑,因为我希望这两行完全相同:这是预期的行为吗?

是的,这应该可行。 这是GCC错误。 GCC尚未完全支持C ++ 0x可变参数模板(公平地说,规范在细节上仍在不断变化)。

您所说的“这有效”实际上是在声明一个功能。 它不会初始化对象,这正是您想要的。

对于您想要的内容,请参见14.3.3p3,它描述template<typename...> class Bar如何匹配foo ,以及14.8.2.5p9,它描述foo<Args...>如何匹配foo<int, double>

template <typename T, typename U>
struct foo {};


struct converter
{
 template <template <typename...> class Bar, class ...Args>
     converter(const Bar<Args...> &){}
};

int main()
{
    converter c1((foo<int,double>())); // This works.
    converter c2 = foo<int,double>();// This works
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM