![](/img/trans.png)
[英]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.