【问题标题】:Pass-by-reference and integral promotion参考传递和积分推广
【发布时间】:2016-03-19 11:18:20
【问题描述】:

为什么编译器不能将char 提升为int&,但通过引用到常量(charint const&)传递它时没有问题?

示例代码:

#include <iostream>
using namespace std;

void func1(int & i)       { cout << "int &       " << i << endl; }
void func2(int const & i) { cout << "const int & " << i << endl; }

int main() {

    char mychar = 'a';
    func1(mychar);    // compiler-error
    func2(mychar);    // no error

    return 0;
}

【问题讨论】:

    标签: c++ type-conversion pass-by-reference overloading integer-promotion


    【解决方案1】:

    这是允许的:

    char c = 'X';
    const int& i = c;
    

    我们将c 隐式提升为int,并将i 绑定到该临时对象。这不会真正导致任何令人困惑的行为。 ic 具有相同的值,只是类型不同。

    但是如果 non-const:

    允许相同的逻辑会发生什么
    char c = 'X';
    int& i = c;
    i = 'J';
    

    i 不能直接绑定到c - 这是错误的类型。我们仍然需要将c 提升为和int 并将i 绑定到该临时对象。但是当我们分配i 时,我们只是修改了我们绑定的临时值——c 仍然是X。这将是令人难以置信的混乱、不直观且容易出错。所以语言禁止它。

    【讨论】:

      【解决方案2】:

      促销和转化会创建一个新的临时对象。非常量引用不能绑定到临时对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-06
        • 1970-01-01
        • 1970-01-01
        • 2010-12-12
        • 2013-06-22
        • 1970-01-01
        • 2019-11-29
        相关资源
        最近更新 更多