C++ 为什么可以';t圆括号是否正确地视为构造函数调用?
我编写了一个C++ 为什么可以';t圆括号是否正确地视为构造函数调用?,c++,constructor,definition,C++,Constructor,Definition,我编写了一个move来模拟std::move,并尝试使用一个新的结构Foo来测试它。然而,发生了一些错误 \main.cpp:在函数“int main()”中: .\main.cpp:46:7:错误:声明“Foo x”冲突 46 | Foo(x); | ^ .\main.cpp:43:15:注意:前面的声明为'std::string x' 43 | std::string x=“123”; | ^ 我将代码Foo(x)替换为Foo-Foo=Foo(x),
move
来模拟std::move
,并尝试使用一个新的结构Foo
来测试它。然而,发生了一些错误
\main.cpp:在函数“int main()”中:
.\main.cpp:46:7:错误:声明“Foo x”冲突
46 | Foo(x);
| ^
.\main.cpp:43:15:注意:前面的声明为'std::string x'
43 | std::string x=“123”;
| ^
我将代码Foo(x)
替换为Foo-Foo=Foo(x)
,然后一切正常。
我正在使用MinGW32 g++9.2.0
,使用命令g++main.cpp-std=c++14
有关更多详细信息,请参见下面的代码:
#包括
样板
结构删除\u引用{
T型;
};
样板
结构删除\u引用{
T型;
};
样板
结构删除\u引用{
T型;
};
样板
constexpr typename Remove_Reference::type&&move(T&&x)noexcept{
返回静态_-cast(x);
}
结构Foo{
Foo(){}
Foo(std::string&&Foo):val(Foo){
std::cout这句话:
Foo(x);
不是函数调用或构造函数调用。它只是一个声明,表示x
属于Foo
类型。声明符x
周围的括号是可选的,因此它等效于:
Foo x;
这当然会产生一个错误,因为您已经有一个名为x
的std::string
,并且不能为同一范围内的多个实体指定相同的名称
请注意,表达式:
与上面的语句不同(带有;
)。此表达式可能表示不同的内容,具体取决于所使用的上下文
例如,此代码:
Foo foo = Foo(x);
非常好。这会从表达式foo(x)
复制名为foo
的变量的初始化,该表达式是从参数x
构造的临时foo
。(这在这里并不特别重要,但从c++17开始,右侧没有临时对象;对象只是在适当的位置构造而成)。此语句:
Foo(x);
不是函数调用或构造函数调用。它只是一个声明,表示x
属于Foo
类型。声明符x
周围的括号是可选的,因此它等效于:
Foo x;
这当然会产生一个错误,因为您已经有一个名为x
的std::string
,并且不能为同一范围内的多个实体指定相同的名称
请注意,表达式:
与上面的语句不同(带有;
)。此表达式可能表示不同的内容,具体取决于所使用的上下文
例如,此代码:
Foo foo = Foo(x);
非常好。这会从表达式foo(x)
复制名为foo
的变量的初始化,该表达式是从参数x
构造的临时foo
。(这在这里并不特别重要,但从c++17开始,右侧没有临时对象;对象只是在适当的位置构建)。您希望Foo{x};
应该做什么?创建一个匿名临时对象?@DanielLangr Yessory,应该是Foo(x);
在我之前的评论中。这也是标准的相关部分:。无论如何,您可以编写Foo(x).val;
来代替。您可能想查找“最麻烦的解析”。@n..代词m。查找是一个好主意,但Foo(x);
没有麻烦的解析。它不能是函数声明。您希望Foo做什么{x}
应该做什么?创建一个匿名临时文件?@DanielLangr Yessory,应该是我之前的评论中的Foo(x);
。这也是标准的相关部分:。无论如何,你可以改为编写Foo(x).val;
。你可能想查找“最麻烦的解析”“@n.”代词是m。这是一个很好的查找方法,但是没有令人烦恼的解析Foo(x);
。它不可能是一个函数声明。为什么?这是歧义的一部分吗?我不确定你的意思。这里没有歧义,只是Foo x;
Foo(x);
,Foo((x))在C++中都是等价的。不能将<代码> Fo-Foo= FoO(x)< /C> >作为调用<代码> Foo(x)
,然后分配给Foo-Foo
?@cigien实际上,似乎有:。@DanielLangr哦,我现在明白你的意思了。编辑了答案以便更清楚。谢谢你指出。为什么?这是歧义的一部分吗?我不确定你的意思。这里没有歧义,只是Foo x;
Foo(x);
,Foo((x)在C++中都是等价的。不能把<代码> Fo-Foo= FoO(x)< /C> >当作调用<代码> FO(x)< /C>,然后分配给<代码> Fo-Foo?