История изменений
Исправление 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]