首页 > 解决方案 > 为什么在构造函数初始化期间我不能使用范围解析运算符?

问题描述

在构造函数的初始化期间使用以下代码中的范围解析运算符会给我错误。为什么只能在函数名前使用作用域解析运算符(ieVector::Vector(int i)?

class Vector {
    public:
        Vector(int s); // declaration an interface to definition or what part is.
        double& operator[] (int i);
        int size();
    
    private:
        double* elem;
        int sz;
        
};

Vector::Vector(int s) : Vector::elem{new double[s]},Vector::sz{s} { }
double& Vector::operator[] (int i) { return Vector::elem[i]; }
int Vector::size() { return Vector::sz; }

int main() {
    int s = 10;
    Vector V(10);
    return 0;
}

标签: c++

解决方案


成员初始化列表比一些任意表达式更受限制。

虽然您确实可以Vector::sz在表达式中限定成员名称,例如 ,通常(其中sz在范围内),但成员初始化列表的一部分的语法根本不支持这一点。你必须写name(init)name{init};没有其他的。

C++ 可以在这里允许限定名称,但是这样做绝对没有意义,同时使解析器更加复杂。

幸运的是,我们实际上不需要以任何方式担心这一点。

tl;博士:因为。


推荐阅读