Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么可以';t圆括号是否正确地视为构造函数调用?_C++_Constructor_Definition - Fatal编程技术网

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?