【发布时间】:2016-07-04 13:17:10
【问题描述】:
以下代码
struct foo
{
foo ()
{ }
template <typename T0, typename ... Ts>
foo (const T0 & t0, const Ts & ... ts)
{ foo(ts...); }
};
int main()
{
foo f(1, 2);
return 0;
}
使用g++ (4.9.2) 编译没有问题并给出以下错误
tmp_002-11,14,gcc,clang.cpp:9:16: error: expected ')'
{ foo(ts...); }
^
tmp_002-11,14,gcc,clang.cpp:9:13: note: to match this '('
{ foo(ts...); }
^
tmp_002-11,14,gcc,clang.cpp:9:14: error: redefinition of 'ts'
{ foo(ts...); }
^
tmp_002-11,14,gcc,clang.cpp:8:42: note: previous definition is here
foo (const T0 & t0, const Ts & ... ts)
^
2 errors generated.
clang++ (3.5)。
像往常一样,我的问题是:谁是对的?
--- 编辑---
澄清:我知道foo(ts...) 不能调用委托构造函数,但(我认为可以)构造一个临时的foo 对象(另一个foo 对象)。
但是,正如 vsoftco 所指出的,sizeof...(ts) == 1U 时发生了什么?
在这种情况下,foo(ts...); 是单个变量ts 的(重新)声明(所以,我想,应该是正确的clang++)或者可变参数语法避免了这个问题(所以,我想,应该对吗g++)?
有 C++11 标准专家可以澄清这一点吗?
ps:对不起,我的英语不好。
【问题讨论】:
-
我不认为你应该被允许调用构造函数,所以 gcc 也应该拒绝它。
-
@vsoftco - 这个想法是创建一个临时对象但是......我认为问题是当它只接收一个参数时
-
哦,我明白了,但我认为编译器相信你在那里有一个电话。不过,我不是 100% 确定。无论如何,构造函数委托应该可以正常工作:
foo (const T0 & t0, const Ts & ... ts) : foo(ts...) {} -
@vsoftco - 在某种程度上,你是对的:我遇到了这个问题,试图解决另一个人的问题,他正在考虑以这种方式调用委托构造函数;但我有理由确定(
coutedthis指针)g++创建另一个对象
标签: c++11 g++ language-lawyer variadic-templates clang++