C++ 常量参数寿命(以c++;
考虑这一点:C++ 常量参数寿命(以c++;,c++,reference,constants,C++,Reference,Constants,考虑这一点: void l(Event const& e) { KeyEvent& k = (KeyEvent&)e; std::cout<<k.action<<" "<<k.keyCode; } void k(Event const& e) { KeyEvent& k = (KeyEvent&)e; std::cout<<k.action<<" "<
void l(Event const& e)
{
KeyEvent& k = (KeyEvent&)e;
std::cout<<k.action<<" "<<k.keyCode;
}
void k(Event const& e)
{
KeyEvent& k = (KeyEvent&)e;
std::cout<<k.action<<" "<<k.keyCode;
}
void t(Event const& e)
{
l(e);
k(e);
}
int main(int argc, char* argv[])
{
t(KeyEvent(1,1));
}
void l(事件常量和e)
{
KeyEvent&k=(KeyEvent&)e;
标准::cout
什么时候从内存中释放KeyEvent对象(是在作用域结束后还是必须删除它)
它一直存在于内存中,直到完整表达式的结尾,即语句的分号;
:
t(KeyEvent(1,1));
^ end of the full-expression
顺便说一下,您应该在此处const
(以避免出现问题):
什么时候从内存中释放KeyEvent对象(是在作用域结束后还是必须删除它)
它一直存在于内存中,直到完整表达式的结尾,即语句的分号;
:
t(KeyEvent(1,1));
^ end of the full-expression
顺便说一下,您应该在此处const
(以避免出现问题):
@伊尔贾恩:未定义的行为在哪里?它的行为就像一个静态施法
,只要目标类型与对象的运行时类型匹配,它就可以向下施法。所以…@Ben:它也像一个常量施法
,抛弃了临时性的常量。@伊尔贾恩:临时性不是常量
,所以这就是peRMITED太多了。@Ben:临时对象只能绑定到常量左值引用,并且e
声明为Event const&e
,所以是常量。@ildjarn:常量引用可以绑定到非常量对象。临时对象不是常量。此外,它只是使用const\u cast
修改常量对象,这是未定义的行为r、 强制转换本身不是。@ildjarn:未定义的行为在哪里?它表现为静态强制转换
,只要目标类型与对象的运行时类型匹配,它就可以向下转换。它确实如此…@Ben:它也表现为常量强制转换
,摆脱了临时变量的常量。@ildjarn:临时变量不是const
,所以这也是允许的。@Ben:临时对象只能绑定到常量左值引用,e
声明为Event const&e
,所以是的,它是常量。@ildjarn:常量引用可以绑定到非常量对象。临时对象不是常量。此外,它只使用const\u cast
修改常量对象这是未定义的行为,强制转换本身不是。从数学上讲,如果我不将常量添加到强制转换中,我会遇到什么样的问题?@LukeB.:您可以修改函数中的k
,编译器不会告诉您它引用的对象是常量对象(当它真的是常量对象时,比如当你将一个常量对象传递给函数时)。从数学上讲,如果我不将常量添加到cast中,我会遇到什么样的问题?@LukeB.:你可以修改函数中的k
,编译器不会告诉你它引用的对象是常量对象(当它真的是常量对象时,比如将常量对象传递给函数时)。