Local variable scope question(局部变量作用域问题)
问题描述
为什么下面的代码打印xxY"?局部变量不应该存在于整个函数的范围内吗?我可以使用这样的行为,还是会在未来的 C++ 标准中改变?
Why is the following code prints "xxY"? Shouldn't local variables live in the scope of whole function? Can I use such behavior or this will be changed in future C++ standard?
我认为根据 C++ 标准 3.3.2在块中声明的名称对该块来说是局部的.它的潜在范围从它的声明点开始,并在其声明区域的末尾结束."
I thought that according to C++ Standard 3.3.2 "A name declared in a block is local to that block. Its potential scope begins at its point of declaration and ends at the end of its declarative region."
#include <iostream>
using namespace std;
class MyClass
{
public:
MyClass( int ) { cout << "x" << endl; };
~MyClass() { cout << "x" << endl; };
};
int main(int argc,char* argv[])
{
MyClass (12345);
// changing it to the following will change the behavior
//MyClass m(12345);
cout << "Y" << endl;
return 0;
}
<小时>
根据响应,我可以假设 MyClass(12345); 是表达式(和范围).这是有道理的.所以我希望下面的代码总是打印xYx":
Based on the responses I can assume that MyClass(12345); is the expression (and scope). That is make sense. So I expect that the following code will print "xYx" always:
MyClass (12345), cout << "Y" << endl;
并且允许进行这样的替换:
And it is allowed to make such replacement:
// this much strings with explicit scope
{
boost::scoped_lock lock(my_mutex);
int x = some_func(); // should be protected in multi-threaded program
}
// mutex released here
//
// I can replace with the following one string:
int x = boost::scoped_lock (my_mutex), some_func(); // still multi-thread safe
// mutex released here
推荐答案
您正确引用了标准.让我强调一下:
You quoted standard correctly. Let me emphasize:
块中的名称 声明是该块的本地.它的潜在作用域从它的声明点开始,到其声明区域的末尾结束.
A name declared in a block is local to that block. Its potential scope begins at its point of declaration and ends at the end of its declarative region.
实际上,您没有声明任何名称.你的线
You didn't declare any name, actually. Your line
MyClass (12345);
甚至不包含声明!它包含一个表达式,它创建一个 MyClass 的实例,计算表达式(但是,在这种特殊情况下没有什么可计算的),并将其结果转换为 void,并销毁在那里创建的对象.
does not even contain a declaration! What it contains is an expression that creates an instance of MyClass, computes the expression (however, in this particular case there's nothing to compute), and casts its result to void, and destroys the objects created there.
一个不那么令人困惑的事情听起来像
A less confusing thing would sound like
call_a_function(MyClass(12345));
你看过很多次,知道它是如何工作的,不是吗?
You saw it many times and know how it works, don't you?
这篇关于局部变量作用域问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:局部变量作用域问题
基础教程推荐
- 常量变量在标题中不起作用 2021-01-01
- 我有静态或动态 boost 库吗? 2021-01-01
- C++结构和函数声明。为什么它不能编译? 2022-11-07
- 在 C++ 中计算滚动/移动平均值 2021-01-01
- 如何在 C++ 中初始化静态常量成员? 2022-01-01
- 静态库、静态链接动态库和动态链接动态库的 .lib 文件里面是什么? 2021-01-01
- 这个宏可以转换成函数吗? 2022-01-01
- 如何通过C程序打开命令提示符Cmd 2022-12-09
- 如何将 std::pair 的排序 std::list 转换为 std::map 2022-01-01
- 如何检查GTK+3.0中的小部件类型? 2022-11-30
