C++ 将常量转换为将其传递给引用的函数,会发生什么?

C++ 将常量转换为将其传递给引用的函数,会发生什么?,c++,casting,parameter-passing,const-cast,C++,Casting,Parameter Passing,Const Cast,有谁能告诉我当传给g的时候这里发生了什么,是静态的吗 int & g (int&x){x++ ; return x ; } int main() { const int a=5 ; cout<<g((int&)a)<<endl; } 我确信没有复制,因为上面的代码与下面的代码类似: class A { public: A() { cout << "calling DEFAULT c

有谁能告诉我当传给g的时候这里发生了什么,是静态的吗

int  & g (int&x){x++ ; return x ; } 
int main()
{

   const int a=5 ; 
   cout<<g((int&)a)<<endl; 
}
我确信没有复制,因为上面的代码与下面的代码类似:

class A
{
public:
    A()
    {
        cout << "calling DEFAULT constructor\n\n";
    }
    A(A& Other)
    {
        cout << "Calling COPY constructor\n\n";
    }
    ~A()
    {
        cout << "Calling DESTRUCTOR\n\n";
    }
};

A& g(A& x)
{
    cout << "Inside g(A& x) \n\n";
    return x;
}

void main()
{
    const A a;
    g(const_cast<A&>(a));
}*/
提前感谢:

静态施法无法移除常数。这是一个康斯特的演员阵容


在运行时,第一个示例中的代码生成未定义的行为,因为您修改了一个const对象

对于int,只需传入引用就不需要代码。你的cast让它编译。

C风格的cast是一件邪恶的事情——它可以完成重新解释cast或const cast所能做的一切。它是一种链锯的强大功能和链锯的易用性,而C语言正是因为它而臭名昭著


使用C++风格的强制转换将表明您需要执行常量转换,然后您应该问自己为什么,并找到更好的方法来执行。

Oops,我错过了并编写了静态转换,而不是常量转换,非常感谢您的回答。未定义的行为是否一定局限于运行时?或者一个确认编译器可以检测到冲突并在编译时重新启动计算机吗?@Fred:我的理解是,表达式只有在计算时才会产生未定义的行为。因此,我认为未定义的行为仅限于运行时,因为无法保证表达式将被计算,例如,另一个翻译单元可能有一些调用std::exit的静态初始化,并且由于这将在输入main之前发生,表达式不会被计算。@Fred AFAIK undefined Behavior从不为编译器在编译过程中崩溃、发射zee导弹等寻找借口。UB是一种运行时现象。不过,编译器可能会检测到冲突并发出警告,如保证调用未定义行为或可能调用未定义行为等,用户可能会将其视为错误。@GMan:否,第二个示例不会显示未定义行为。第一个例子确实如此。我认为这个问题是关于第一个例子的;我会澄清的,谢谢!我知道,但是编译器隐式地做什么转换呢?它当然不是重新解释转换,因为int的位与引用不同。它当然也不是动态的,因为int不是一个带有虚函数的类,int&也不是int的超类。它不能是静态的,因为你不能改变常量。所以,如果有什么区别的话,它是常量-但是没有任何东西表明旧样式的cast必须做新样式的cast。实际上,C样式的cast是根据静态、常量和重新解释的cast来指定的,所以它总是执行这三者的某种组合,尽管有些行为略有不同,例如,C样式转换在执行静态转换之前不会检查基类可访问性,因此您可以使用C样式转换转换到私有基类,但不能使用静态转换。我想我们说的是同一件事-我说这肯定不是一种新样式,你说这可能是一个组合或不同的行为。@James:你说的是标准吗?我写的是非标准的吗?我在等待你的回答,非常感谢:最后一个问题,如果我们使用变量而不是常量,那么应用的类型是什么?感谢所有回答这个问题的人:这里使用postfix++的原因是什么?int&g int&x{x++;return x;}为什么不int&g int&x{return++x;}?