【发布时间】:2021-11-24 11:37:08
【问题描述】:
在C++入门第5版的解决方案附录中,给出了一个关于switch语句的例子:
case true: string file_name; // error: control bypasses an implicitly initialized variable. ... case false: if(file_name.empty()); // file_name is in scope but wasn't initialized.
但我认为这是错误的,因为 file_name 已被隐式初始化,这就是编译器标记该错误的原因。
struct Foo{};
switch(val){
case 1:
Foo f; // ok not-implicitly initialized like std::string
break;
case 2:
f.some_member(); // use f;
}
所以我的猜测正确吗?
【问题讨论】:
-
什么是“隐式初始化”?
-
@StoryTeller-UnslanderMonica:
file_name,其类型为std::string。我认为没有像Foo f{};这样的显式值初始化。书中有“隐式初始化”这个表达。 -
如果书中有“隐式初始化”,要么是没有正确定义,要么是这里有一些误解。在那个领域之外,这是一个毫无意义的术语。也许这里的意思是“默认初始化”?
-
我推测这本书中“隐式初始化”的意思是调用了默认构造函数。
-
switch语句及其case标签是结构化的goto。case标签没有自己的范围,尽管您可以放入自己的case 0: { ... } break;以提供自己的范围块。在一个case标签中定义的变量,但它绕过了 构造,因为switch值转到后续的case标签将不会被构造。我自己的建议是:不要那样做。 (C++ 给了你足够的绳索让你在脚上开枪。)
标签: c++ scope switch-statement declaration