Tại sao mã sau đây in "xxY"? Các biến cục bộ có nên sống trong phạm vi toàn bộ hàm không? Tôi có thể sử dụng hành vi như vậy hoặc điều này sẽ được thay đổi trong tiêu chuẩn C++ trong tương lai?Câu hỏi phạm vi biến cục bộ
tôi nghĩ rằng theo tiêu chuẩn C++ 3.3.2 "Một tên tuyên bố trong một khối là địa phương để khối đó. Phạm vi tiềm năng của nó bắt đầu vào thời điểm nó khai báo và kết thúc vào cuối của khu vực khai báo của nó."
#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;
}
Dựa trên những phản hồi tôi có thể giả định rằng MyClass(12345);
là biểu thức (và phạm vi). Điều đó có ý nghĩa. Vì vậy, tôi hy vọng rằng đoạn mã sau sẽ in "xyx" luôn:
MyClass (12345), cout << "Y" << endl;
Và nó được phép làm thay thế như:
// 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
Câu hỏi của bạn chứa câu trả lời: * Tên được khai báo ... *. Không có tên! – quamrana
Trong ví dụ này: MyClass (12345) là một kiểu đúc hàm, không phải là khai báo. –
Tuy nhiên, không có tên cho ví dụ – artificialidiot