标签: const-correctness

关于const成员函数

我遇到了const成员函数的两个解释

class A{
  public:
  ...
  void f() const {}
  ...
}
Run Code Online (Sandbox Code Playgroud)
  1. 这意味着它只能访问不变成员;
  2. 这意味着它不会修改任何成员;

我认为第二个是正确的.但为什么第一个出来呢?有什么需要澄清的吗?

谢谢!

c++ const const-correctness

8
推荐指数
2
解决办法
6955
查看次数

具有丰富类型的C#中的const正确性

来自C++背景并尝试学习C#,我遇到的最令人沮丧的语言遗漏之一就是const关键字.

所以,我一直试图找到一种可以用来在C#中实现const正确性的模式.

这个答案有一个有趣的建议:为你的所有类型创建一个只读界面.但正如Matt Cruikshank在评论中指出的那样,如果你的班级有收藏品或其他丰富类型,这就成了问题.特别是如果您无法控制类型,并且无法使其实现只读接口.

是否存在可以处理丰富类型和集合的任何模式或解决方案,或者我们是否强制在C#中进行复制?在C#中完全放弃const正确性是否更好?

.net c# const const-correctness readonly

8
推荐指数
1
解决办法
476
查看次数

clang 认为我需要指向“const 函数”吗?

GodBolt

考虑以下代码片段:

using A = void(*)(int);

A foo(const void* ptr) 
{
    return reinterpret_cast<A>(ptr);
}
Run Code Online (Sandbox Code Playgroud)

GCC 10 喜欢这个就好了。但是,clang++-10 说这是一个错误!

<source>:5:12: error: reinterpret_cast from 'const void *' to 'A' (aka 'void
 (*)(int)') casts away qualifiers

    return reinterpret_cast<A>(ptr);

           ^~~~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

函数在 C++(和 C)中是不可变的,并且没有“const 函数”。那么为什么 clang++ 在这里抱怨呢?

c++ function-pointers const-correctness reinterpret-cast clang++

8
推荐指数
1
解决办法
128
查看次数

如何在模板函数签名中要求const_iterator语义?

我正在创建一个构造函数,它将采用一对输入迭代器.我希望方法签名具有const类似于的编译时语义:

DataObject::DataObject(const char *begin, const char *end)
Run Code Online (Sandbox Code Playgroud)

但是,我找不到任何这方面的例子.例如,我的STL实现的范围构造函数vector定义为:

template<class InputIterator>
vector::vector(InputIterator first, InputIterator last)
{
    construct(first, last, iterator_category(first));
}
Run Code Online (Sandbox Code Playgroud)

没有编译时const保证. iterator_category/ iterator_traits<>包含任何与之无关的内容const.

有没有办法指示保证调用者不能修改输入数据?

编辑,2010-02-03 16:35 UTC

作为我想如何使用该函数的一个例子,我希望能够传递一对char*指针并根据函数签名知道它们指向的数据不会被修改.
我希望我能避免创建一对const char*指针来保证const_iterator语义.在这种情况下,我可能被迫支付模板税.

c++ templates iterator const const-correctness

7
推荐指数
2
解决办法
1722
查看次数

构建一个依赖于非const正确库的const-correct(C++)库

我正在用C++建立一个图书馆(主要是为了好玩)我已经工作了一段时间了(几年,哈哈,这只是一个爱好)

我最近将一些基础(读取,库依赖)切换到另一个库.不幸的是,所述库并不关心'const-correctness'.我有点强迫症,我喜欢挑战自己做"正确的方式",所以我想让我的库保持正确.我已经开始了几次,有些部分是; 我知道最好从一开始就开始使用const-for,但这并不是真的相关或争论不休.事实是,我有兴趣再次认真考虑,但另一个图书馆阻止我这样做.

怎么样,你可能会问?

好吧,如果我正在调用一个显然应该是const的方法(实际上没有改变任何东西),并且我的方法也是consting(新词)的候选者,我无法确保我的方法的常量,直到其他方法也是const.

例:

// Bad third-party library

struct Foo
{
    void should_be_const() {}
};

// My library

struct Bar
{
    Foo my_foo;
    void should_be_const() const
    {
        my_foo.should_be_const(); // ERROR!  Not a const function!
    }
};
Run Code Online (Sandbox Code Playgroud)

这只有我从经验证据和我对有关常数的研究和理解中才能看出来.然而,这可能是一种错误形成的理解,所以我是开放的(并且有希望?)它是错误的并且以其他方式显示(尽管这会动摇我对常数的理解的基础哈哈)

如果他(或她)想要写一个合适的图书馆,但依赖性不是这样编写的话,那么做一个可怜的灵魂是什么?

我希望这是一个适合SO的问题.请(我相信你会)让我知道它是不是或者是否有更好的StackExchange网站发布.

PS我发现了这个问题,但我希望能够详细阐述主题/解决方案.

c++ const-correctness

7
推荐指数
1
解决办法
300
查看次数

const Class&amp; 和 Class const&amp; 之间有什么区别吗?

这些表达之间有什么区别:

const Class&
Class const&
Run Code Online (Sandbox Code Playgroud)

例如,当这些是函数的参数时?

reference const-correctness

7
推荐指数
1
解决办法
1089
查看次数

java中的const函数参数?

有没有办法const在Java中实现类似于C++的东西?具体来说,我有一个像

private static Vector2 sum(Vector2 vec1, Vector2 vec2) {
    return vec1.cpy().add(vec2);
}
Run Code Online (Sandbox Code Playgroud)

而且我想

  1. 在签名中明确表示它不会修改它的参数,
    并且
  2. 强制它不修改它的参数(最好是在编译时,但插入运行时断言也可以).

现在我知道java严格按引用传递(我只是戏弄,我知道它是传值,或者更确切地说是复制 - 引用).我的意思是,在Java中,当您调用方法时,将复制引用,但该引用指向相同的对象内容.如果类具有公共字段或setter,则被调用的方法始终可以修改传递的对象的内容.是否有任何例如注释@NotNull或工具来防止这种情况?我刚刚发现JetBrains注释@Contract(pure = true),但我不认为它们提供任何检查.

java const-correctness

7
推荐指数
1
解决办法
4229
查看次数

将shared_ptr的向量转换为shared_ptr的向量为const

class A
{
    std::vector<std::shared_ptr<int>> v_;
};
Run Code Online (Sandbox Code Playgroud)

现在我想添加v_使用两个公共成员函数的访问权限

std::vector<std::shared_ptr<int>> const & v() { return v_; }
Run Code Online (Sandbox Code Playgroud)

std::vector<std::shared_ptr<int const> const & v() const { TODO }
Run Code Online (Sandbox Code Playgroud)

我不能代替TODO使用return v_;,虽然.

一种选择是不返回引用而是复制.除了明显的性能损失之外,这也会使界面不那么令人满意.

另一种选择是TODO等于return reinterpret_cast<std::vector<std::shared_ptr<int const>> const &>(v_);

我的问题是,这是不确定的行为吗?或者,或者,是否有更好的选择,最好不使用reinterpret_cast

c++ vector const-correctness undefined-behavior reinterpret-cast

7
推荐指数
1
解决办法
447
查看次数

如何在具有非常量指针键的映射中通过常量指针键查找

以下 C++ 代码无法编译,因为它将非常量指针传递给需要 const 指针的find()函数。

#include <map>

std::map<int*, double> mymap;

double myfind(const int * mykey)
{
    return mymap.find(mykey)->second;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在不改变地图类型或使变量mykey非常量的情况下使查找工作?毕竟函数find()不会修改指向的对象,它只是比较指针。

c++ stl const-correctness const-cast const-pointer

7
推荐指数
1
解决办法
1154
查看次数

std::unique_ptr 中运算符 * 的常量正确性

为什么 std::unique_ptr 的 'operator*' 成员函数可以标记为 const ( https://en.cppreference.com/w/cpp/memory/unique_ptr/operator *) 而像 'front()'、 'back( std::vector 中的 )'、'operator[]' 等未标记为 const?两者都返回对其管理的资源的非常量引用。

核心问题是我无法理解第一部分,即为什么我们能够将“operator*”标记为 const,即当该函数中的“*this”指针是 const 时,返回类型如何为“T&”指针(由于函数被标记为 const)?

c++ const-correctness unique-ptr

7
推荐指数
1
解决办法
394
查看次数