LINUX.ORG.RU

История изменений

Исправление rmammoth, (текущая версия) :

monk, как принято у ругателей C++, немного… э-э… сделал то самое неаппетитное в лужу. В C++23 код

class Something {
  public:
    const std::vector<int> &v() const {
        return _v;
    }
    ~Something() {
        std::print("\nSomething destructed\n");
    }
  private:
    std::vector<int> _v = {1, 2, 3, 4, 5, 6, 7, 8};
};

Something make_smth() {
    return Something();
}

int main() {
    for (auto x : make_smth().v()) {
        std::print("{}", x);
    }
}

по стандарту корректен, безопасен и выводит:

12345678
Something destructed

Вообще же правильно было бы объявить метод так:

    const std::vector<int> &v() const & {
        return _v;
    }

Тогда в тех старых версиях C++, где временный объект Something не «живет» в ходе исполнения цикла, код не скомпилируется.

Для полного счастья, если мы хотим, чтобы такое было уж совсем безопасно во всех стандартах:

    const std::vector<int> &v() const & {
        return _v;
    }
    std::vector<int> v() && {
        return _v;
    }

Исправление rmammoth, :

monk, как принято у ругателей C++, немного… э-э… сделал то самое в лужу. В C++23 код

class Something {
  public:
    const std::vector<int> &v() const {
        return _v;
    }
    ~Something() {
        std::print("\nSomething destructed\n");
    }
  private:
    std::vector<int> _v = {1, 2, 3, 4, 5, 6, 7, 8};
};

Something make_smth() {
    return Something();
}

int main() {
    for (auto x : make_smth().v()) {
        std::print("{}", x);
    }
}

по стандарту корректен, безопасен и выводит:

12345678
Something destructed

Вообще же правильно было бы объявить метод так:

    const std::vector<int> &v() const & {
        return _v;
    }

Тогда в тех старых версиях C++, где временный объект Something не «живет» в ходе исполнения цикла, код не скомпилируется.

Для полного счастья, если мы хотим, чтобы такое было уж совсем безопасно во всех стандартах:

    const std::vector<int> &v() const & {
        return _v;
    }
    std::vector<int> v() && {
        return _v;
    }

Исправление rmammoth, :

В C++23 код

class Something {
  public:
    const std::vector<int> &v() const {
        return _v;
    }
    ~Something() {
        std::print("\nSomething destructed\n");
    }
  private:
    std::vector<int> _v = {1, 2, 3, 4, 5, 6, 7, 8};
};

Something make_smth() {
    return Something();
}

int main() {
    for (auto x : make_smth().v()) {
        std::print("{}", x);
    }
}

по стандарту корректен, безопасен и выводит:

12345678
Something destructed

Вообще же правильно было бы объявить метод так:

    const std::vector<int> &v() const & {
        return _v;
    }

Тогда в тех старых версиях C++, где временный объект Something не «живет» в ходе исполнения цикла, код не скомпилируется.

Для полного счастья, если мы хотим, чтобы такое было уж совсем безопасно во всех стандартах:

    const std::vector<int> &v() const & {
        return _v;
    }
    std::vector<int> v() && {
        return _v;
    }

Исправление rmammoth, :

В C++23 код

class Something {
  public:
    const std::vector<int> &v() const {
        return _v;
    }
    ~Something() {
        std::print("\nSomething destructed\n");
    }
  private:
    std::vector<int> _v = {1, 2, 3, 4, 5, 6, 7, 8};
};

Something make_smth() {
    return Something();
}

int main() {
    for (auto x : make_smth().v()) {
        std::print("{}", x);
    }
}

по стандарту корректен, безопасен и выводит:

12345678
Something destructed

Вообще же правильно было бы объявить метод так:

    const std::vector<int> &v() const & {
        return _v;
    }

Тогда в тех старых версиях C++, где временный объект Something не «живет» в ходе исполнения цикла, код не скомпилируется.

Исправление rmammoth, :

В C++23 код

class Something {
  public:
    const std::vector<int> &v() const {
        return _v;
    }
    ~Something() {
        std::print("\nSomething destructed\n");
    }
  private:
    std::vector<int> _v = {1, 2, 3, 4, 5, 6, 7, 8};
};

Something make_smth() {
    return Something();
}

int main() {
    for (auto x : make_smth().v()) {
        std::print("{}", x);
    }
}

по стандарту корректен, безопасен и выводит:

12345678
Something destructed

Вообще же правильно было бы объявить метод так:

    const std::vector<int> &v() const & {
        return _v;
    }

Тогда в тех версиях C++, где временный объект Something не «живет» в ходе исполнения цикла, код не скомпилируется.

Исправление rmammoth, :

В C++23 код

class Something {
  public:
    const std::vector<int> &v() const {
        return _v;
    }
    ~Something() {
        std::print("\nSomething destructed\n");
    }
  private:
    std::vector<int> _v = {1, 2, 3, 4, 5, 6, 7, 8};
};

Something make_smth() {
    return Something();
}

int main() {
    for (auto x : make_smth().v()) {
        std::print("{}", x);
    }
}

выводит:

12345678
Something destructed

Вообще же правильно было бы объявить метод так:

    const std::vector<int> &v() const & {
        return _v;
    }

Тогда в тех версиях C++, где временный объект Something не «живет» в ходе исполнения цикла, код не скомпилируется.

Исправление rmammoth, :

В C++23 код

[code=cpp] class Something { public: const std::vector &v() const { return _v; } ~Something() { std::print(«\nSomething destructed\n»); } private: std::vector _v = {1, 2, 3, 4, 5, 6, 7, 8}; };

Something make_smth() { return Something(); }

int main() { for (auto x : make_smth().v()) { std::print(«{}», x); } } [/code]

выводит:

[code] 12345678 Something destructed [/code]

Исходная версия rmammoth, :

В C++23 код

[code] class Something { public: const std::vector &v() const { return _v; } ~Something() { std::print(«\nSomething destructed\n»); } private: std::vector _v = {1, 2, 3, 4, 5, 6, 7, 8}; };

Something make_smth() { return Something(); }

int main() { for (auto x : make_smth().v()) { std::print(«{}», x); } } [/code]

выводит:

[code] 12345678 Something destructed [/code]