gpt4 book ai didi

c++ - Variadic 模板和通过分配复制构造

转载 作者:行者123 更新时间:2023-11-27 22:29:24 26 4
gpt4 key购买 nike

考虑这个最小的例子:

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> .

关于c++ - Variadic 模板和通过分配复制构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4749863/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com