[英]How does istream::operator>>( const char& ) as no such function is implemented?
[英]const char& as an argument to a function
我需要對以下代碼塊進行一些說明。 我正在研究類似的編碼,我想了解它是如何工作的。 Google上沒有太多提及,而且我發現的唯一提及對我來說太技術性了。
在以下代碼中,線程和非線程函數具有不同的輸出。 這是為什么?
#include <boost/thread.hpp> #include <iostream> #include <stdio.h> using namespace std; void fTry1(const char&); void fTry2(const char&); int main() { boost::thread tTry1, tTry2; const char *a = "efgh"; tTry1 = boost::thread(fTry1, *a); fTry2(*a); tTry1.join(); return 0; } void fTry1(const char& a) { cout << "Thread" << endl; cout << &a << endl; } void fTry2(const char& a) { cout << "Non-thread" << endl; cout << &a << endl; }
樣本輸出:
Non-thread
efgh
Thread
e<garbage data>
如果我更改以下行
cout << &a << endl;
至
cout << a << endl;
輸出變為類似
Non-thread
e
Thread
e
同樣,為什么呢?
-
我正在處理的代碼使用數字2,但是傳遞的字符串是文件夾的路徑,因此我需要整個字符串,而不僅僅是第一個字符。 但是由於我不了解它是如何工作的,因此我將無法輕易對其進行更改。
默認情況下,傳遞給boost::thread
的參數將被value
“捕獲”。 要通過reference
捕獲它們,必須使用boost::ref
;
tTry1 = boost::thread(fTry1, boost::ref(*a));
例如,這非常類似於lambda函數:
const char *a = "efgh";
const char &c = *a;
auto garbage = [c]() { // c captured by value
cout << &c << endl;
};
auto works = [&c]() { // c captured by ref
cout << &c;
};
garbage();
works();
注意:
請小心將references
或pointers
傳遞給新線程,因為您需要確保在新線程正在使用它們時它們保持有效。 但是,在您的獨特情況下,這並不適用,因為字符串文字efgh
具有static duration
因此無論哪種方式都是安全的。
const char *a = "efgh";
的字符串文字const char *a = "efgh";
使用隱藏的終止符'\\0'
編譯。
當您像*a
一樣傳遞它時,您將取消引用它。 您基本上只傳遞了一個字符。 這對於非線程函數來說還可以,因為如果您使用&a
來獲取字符a
的地址(使其成為c字符串),它仍將指向包含終止符的字符串文字"efgh"
。 cout
將繼續打印,直到碰到終止符。
但是,我懷疑,當您將*a
傳遞給boost::thread
它實際上是在復制字符,而只是復制字符,而不是整個字符串。 當您稍后使用&a
將其重新轉換為c樣式的字符串時&a
不再有終結符,因此cout
會不斷地繼續打印,您會看到垃圾。
當您更改cout << &a << endl;
cout << a << endl;
您告訴cout
您只有wnat才能打印1個字符。 因此它只會打印1。
您用c++
標記了問題,為什么不使用std::string
呢?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.