在C++ 03中,表达式是rvalue或lvalue.
在C++ 11中,表达式可以是:
两类已成为五大类.
我目前正在撰写我的学位论文,它还涉及C++ 11背后的理论的一些解释,这很好,因为C++是我选择的编程语言,而且标准或多或少是免费提供的(N3337)让你自己迷失在.
然而,我试图准确而详细地解释新的xvalue类别时遇到了障碍.我的理解是临时对象总是一个xvalue但我在标准中找不到任何对此的引用.我的理解是函数的表达式的值类别调用具有非引用返回类型的函数是xvalue.标准说"xvalue是涉及rvalue-references的某种表达式的结果",这让我烦恼.例如:
TestClass { ... };
testClass createObject() { return testClass(); }
void someFunction(TestClass& testClass) { ... }
void someFunction(TestClass&& testClass) { ... }
someFunction(createObject());
Run Code Online (Sandbox Code Playgroud)
正如所料,上面将调用带有rvalue-reference作为参数的重载函数.然而,createObject()不返回rvalue-reference,它返回一个TestClass类型的临时对象.我现在的问题是,我必须解释其背后的原因.表达式"createObject()"评估为什么?如果它确实是一个xvalue,因为它返回一个临时对象,它背后的推理是明确的,并且在重载解析期间有利于rvalue-reference.如果没有,那么关于标准的这种行为的解释是什么?是否有某些我尚未找到的隐式转换逻辑?
如果有人能帮我解决这个问题,我真的很感激,因为即使经过几天的挖掘和阅读,我还没有想出一个合理的解释.非常感谢提前.
我在代码中收到警告:
警告:取临时的地址
我见过类似的问题,但他们没有回答我的具体问题.
这是我的代码正在做的事情:
vector<A*>* ex_A;
ex_A->push_back( &A()); //I get this warning taking address of temporary
Run Code Online (Sandbox Code Playgroud)
这是未定义的行为吗?
我之前确实有这个,这很好,但我不想担心从堆中删除内存.
vector<A*>* ex_A;
ex_A->push_back( new A());
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释这个警告意味着什么吗?