【发布时间】:2020-03-10 11:23:32
【问题描述】:
下面的小程序
#include <vector>
#include <iostream>
std::vector<int> someNums()
{
return {3, 5, 7, 11};
}
class Woop
{
public:
Woop(const std::vector<int>& nums) : numbers(nums) {}
void report()
{
for (int i : numbers)
std::cout << i << ' ';
std::cout << '\n';
}
private:
const std::vector<int>& numbers;
};
int main()
{
Woop woop(someNums());
woop.report();
}
有一个悬空引用问题,似乎没有编译器警告过。 问题是临时变量可以绑定到 const-refs,你可以 然后留下来。那么问题是;有没有办法避免陷入这个问题?最好是一个 不涉及牺牲 const 正确性,或总是使 大对象的副本。
【问题讨论】:
-
这很棘手。我可以向您保证,我在创建成员变量 const 引用之前会三思而后行。如果有疑问,我会考虑以某种方式对这些数据进行建模,以便涉及智能指针(
std::unique_ptr用于独占所有权,std::shared_ptr或共享所有权,或std::weak_ptr至少可以识别丢失的数据)。 -
在 C++ 中,您无需为不需要/使用的东西付费。程序员应注意当引用仍在使用/存在时,引用对象的生命周期不会结束。原始指针也是如此,......有智能指针可以为您带来您要求的功能:)
-
引用成员总是一个错误:herbsutter.com/2020/02/23/references-simply
-
虽然编译器没有发出警告,但这个错误可以被 Valgrind 和
-fsanitize=address捕获。我认为没有任何最佳做法可以在不牺牲性能的情况下避免它。
标签: c++