我遇到了const成员函数的两个解释
class A{
public:
...
void f() const {}
...
}
Run Code Online (Sandbox Code Playgroud)
我认为第二个是正确的.但为什么第一个出来呢?有什么需要澄清的吗?
谢谢!
来自C++背景并尝试学习C#,我遇到的最令人沮丧的语言遗漏之一就是const关键字.
所以,我一直试图找到一种可以用来在C#中实现const正确性的模式.
这个答案有一个有趣的建议:为你的所有类型创建一个只读界面.但正如Matt Cruikshank在评论中指出的那样,如果你的班级有收藏品或其他丰富类型,这就成了问题.特别是如果您无法控制类型,并且无法使其实现只读接口.
是否存在可以处理丰富类型和集合的任何模式或解决方案,或者我们是否强制在C#中进行复制?在C#中完全放弃const正确性是否更好?
考虑以下代码片段:
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++
我正在创建一个构造函数,它将采用一对输入迭代器.我希望方法签名具有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++建立一个图书馆(主要是为了好玩)我已经工作了一段时间了(几年,哈哈,这只是一个爱好)
我最近将一些基础(读取,库依赖)切换到另一个库.不幸的是,所述库并不关心'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我发现了这个问题,但我希望能够详细阐述主题/解决方案.
有没有办法const在Java中实现类似于C++的东西?具体来说,我有一个像
private static Vector2 sum(Vector2 vec1, Vector2 vec2) {
return vec1.cpy().add(vec2);
}
Run Code Online (Sandbox Code Playgroud)
而且我想
现在我知道java严格按引用传递(我只是戏弄,我知道它是传值,或者更确切地说是复制 - 引用).我的意思是,在Java中,当您调用方法时,将复制引用,但该引用指向相同的对象内容.如果类具有公共字段或setter,则被调用的方法始终可以修改传递的对象的内容.是否有任何例如注释@NotNull或工具来防止这种情况?我刚刚发现JetBrains注释@Contract(pure = true),但我不认为它们提供任何检查.
让
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
以下 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()不会修改指向的对象,它只是比较指针。
为什么 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)?