【问题标题】:Binding const references to const values only仅将 const 引用绑定到 const 值
【发布时间】:2017-03-12 04:30:37
【问题描述】:

我正在编写一个在集合元素中查找对(使用特定条件)的代码。我真的不想复制集合的元素,所以我想我会使用指针对。但是,如果原始集合中的值可以更改,则这是不安全的。

在我的代码中,我想使用一个 const 引用,它只绑定到真正的常量值(因为我不想让用户滥用这些对)。但是这种方法:

using PairCollectionType =
    std::vector<std::pair<std::shared_ptr<Cluster>, std::shared_ptr<Cluster>>>;

PairCollectionType getClusterPairCollection(
    const std::vector<Cluster> const& clusterCollection)
{
    // ...
}

-> 导致“重复'const'”的错误。我知道这可以通过指针来实现:

const ptr_type* const ptrThatBindsOnlyToConsts;

这是否也可以通过引用实现?

【问题讨论】:

  • 默认情况下引用为const。一旦你将它“引用”到某个东西,它就完成了,它总是会引用同一个对象。如果你写ref = new_object;,引用并没有改变,它只是用new_object赋值给被引用的对象。
  • const std::vector&lt;Cluster&gt; const&amp; clusterCollection&amp; 的左侧有 2 个 const。你只允许一个。
  • ptrThatBindsOnlyToConsts 可以指向非常量对象。例如。 int x = 5; const int *const y = &amp;x;。第二个const 意味着它不能被设置为指向别的东西,除了它被初始化指向的东西。
  • 如果您发布一个可以编译的MCVE,它可能会帮助人们了解您要解决的问题,但您希望它给出编译错误。

标签: c++ c++11 pointers reference constants


【解决方案1】:

我不确定您需要这样做的理由。但是如果调用者传递了一个非常量参数,你可以通过添加重载来捕获这些情况,从而给出编译错误:

void func(U const &)
{
    // the real code
}

void func(U &) = delete;
void func(U&&) = delete;

int main()
{
    U u;
    U const cu {};

    func(cu);    // OK
    func(u);     // error
    func(U{});   // error
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    相关资源
    最近更新 更多