Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 常量参数寿命(以c++;_C++_Reference_Constants - Fatal编程技术网

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
,编译器不会告诉你它引用的对象是常量对象(当它真的是常量对象时,比如将常量对象传递给函数时)。