我有一个链接多个静态库的项目(例如libModule.a).当我尝试导航到Module lib中的类时,Clion只将我带到头部声明并停止那里的导航.我希望能够深入了解Module lib中的函数定义.
我有以下代码段:
typedef char OR[12];
class COR
{
OR m_or;
public:
COR(const char* or) { strcpy(m_or, or); }
COR(const COR& o) { strcpy(m_or, o.m_or); }
const char* GetOR() const { return m_or; }
#if 0 // I do not wish to use this as it will create a temporary object
bool operator<(const COR& left, const COR& right) const
{ return (strcmp(left.m_or, right.m_or) < 0); }
#endif
};
namespace std {
template<>
struct less<COR> {
bool operator()(const COR& cor, const char* or) …Run Code Online (Sandbox Code Playgroud) 我有一个返回右值引用的函数.
auto function() -> int&& {
int x{10};
std::cout << x << std::endl; // to check the value of x
return std::move(x);
}
Run Code Online (Sandbox Code Playgroud)
现在,当我使用以下代码时:
std::cout << function() << std::endl;
std::vector<int> v;
v.push_back(function());
std::cout << v[0] << std::endl;
Run Code Online (Sandbox Code Playgroud)
这导致以下输出
10
0
Run Code Online (Sandbox Code Playgroud)
看起来即使function()返回一个rvalue-reference,vector也会推回一个默认的构造int.
有趣的是,如果我有这样的代码:
auto x = function();
v.push_back(std::move(x));
Run Code Online (Sandbox Code Playgroud)
这非常有效.
看来如果我只是从函数返回一个局部变量,那么RVO无论如何都会做一个复制省略.但是因为我正在做一个明确的std :: move()我正在绊倒RVO导致返回一个临时变量.
现在,在v.push_back(function())中我调用了vector :: push_back(T &&)函数,导致引用对temp变量的引用.在这种情况下,它总是倾向于0而不是垃圾(我猜这是因为优化打开).
但是,如果我尝试在局部变量中捕获function()的返回值,它可能会起作用,大概是因为在返回值的过程中创建的临时变量的值被复制到此局部变量.对于未定义的行为,这看起来并不幸运.