[英]How lock_guard<mutex> constructor can be compiled fine without mutex instance?
我現在正在研究C ++ 11中的線程,並且遇到了以下代碼行:
lock_guard<mutex> lg(mutex);
沒有可變的mutex
。 mutex
只是類型的名稱。
誰能解釋我上面的代碼行是如何工作的?
為什么編譯器(GCC)不會顯示任何錯誤?
完整的代碼:
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
using namespace std;
void do_something()
{
lock_guard<mutex> lg(mutex);
cout << "Working..." << endl;
this_thread::sleep_for(chrono::milliseconds(3000));
}
int main()
{
thread thd(do_something);
thd.join();
}
編譯器認為這是原型函數聲明:
lock_guard<mutex> lg(mutex);
為了清楚起見,編譯器將其解析為名為“ lg”的函數的聲明,該函數將互斥量作為參數並返回lock_guard實例。
#include <mutex>
int main()
{
using namespace std;
lock_guard<mutex> lg(mutex);
return 0;
}
vc12 output : warning C4930 : 'std::lock_guard<std::mutex> lg(std::mutex)' : prototyped function not called(was a variable definition intended ? )
在C ++結構中,類,枚舉和聯合名稱位於它們自己的名稱空間(不是C ++ namespace
)中,這使您可以擁有與結構相同名稱的變量。
例如:
struct SomeStruct
{
// Member...
};
SomeStruct SomeStruct; // Valid declaration
至於沒有收到錯誤,如果您使用的函數在成員函數中顯示了它,則可能是該類具有名為mutex
量的成員變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.