【发布时间】:2020-06-10 19:31:15
【问题描述】:
正如 tile 所暗示的,在 C++ 中,我们不能拥有包含引用的包含,因为容器内的对象必须是可分配的。初始化后我们无法重新分配引用。
但是,在我的程序中,我有一个 static const std::map,它将 const 引用保存为值,并且可以正常编译。我想知道原因是否是因为映射被声明为 const 并在声明时初始化,这告诉编译器“这个对象是 const 并且它的内容不会改变,所以可以将 const 引用作为它的值”。
我在其他任何地方都找不到答案。该代码有效,但我不希望它混淆其他开发人员。
编辑, 抱歉,我没有包含代码。就是这样:
const glm::dvec4& GetObjectColor(const msg::ObjectType type) {
static const std::map<msg::ObjectType, const glm::dvec4&> kObjectColorMap = {
{msg::ObjectType::PERSON, kWhite},
{msg::ObjectType::ANIMAL, kSilver},
{msg::ObjectType::SEDAN, kGray},
{msg::ObjectType::SUV, kRed},
{msg::ObjectType::VAN, kMaroon},
{msg::ObjectType::BICYCLE, kYellow},
{msg::ObjectType::TRICYCLE, kOlive},
{msg::ObjectType::MOTORCYCLE, kLime},
{msg::ObjectType::TRUCK, kGreen},
{msg::ObjectType::BUS, kAqua},
{msg::ObjectType::PICKUP, kTeal},
{msg::ObjectType::UNKNOWN, kBlue}};
return kObjectColorMap.at(type);
}
【问题讨论】:
-
“它编译得很好”代码或没有发生。请包含minimal reproducible example
-
如果
T&,使用std::reference_wrapper<T>怎么样? -
一个 const 容器在创建时仍然需要分配元素。您无法分配引用,因此它仍然会失败。
-
没有代码,你能得到的最佳答案在这里:stackoverflow.com/questions/4010937/…
-
@NathonOliver 哦抱歉链接错误。我想发布的例子是:wandbox.org/permlink/gbLmbmNy6D3FnMjJ
标签: c++ reference static containers constants