为rvalue对象调用非const成员函数是否安全?

时间:2015-08-21 13:17:40

标签: c++ c++11

在阅读C ++ 11中的多线程时,我注意到一些教程会这样做:

std::thread(print_message, "Hello").detach();

// instead of...

std::thread t(print_message, "Hello");
t.detach();

我的问题是:

  1. 通常,为临时(rvalue)对象调用非const成员函数是否安全?
  2. 特别是对于C ++ 11 std::thread
  3. 这样做是否安全

3 个答案:

答案 0 :(得分:10)

  1. 是:当对象仍然存活时,会执行非const函数,因此没有问题。
  2. 是:std::thread的行为与其他任何类型相同。

答案 1 :(得分:5)

要详细说明第二个问题,临时std::thread对象的行为与任何其他临时对象相同:

在评估绑定的full expression之后销毁它,这意味着在.detach()调用后始终调用the destructor - std::terminate()未被调用。

答案 2 :(得分:1)

回答问题1: 您无权修改“非类”类型(即内置类型)的匿名临时对象。但是,您可以在“类”类型的匿名临时对象上调用非常量成员函数。 参见C ++ ISO / IEC 14882:1998标准中的3.10.10。