C++或Java编译器如何确保在const成员函数中没有任何成员变量状态发生变化(mutable是异常(exception))。编译器会把代码放在不可写的代码段之类的吗? 最佳答案 编译器不确定。不能,因为没有规定用说成员变量state不能的语言更改const成员函数。唯一的规则是你不能通过this指针改变状态(没有丢弃const)。 关于c++-编译器如何确保const成员函数中没有更改数据成员状态?(在C++或Java中),我们在StackOverflow上找到一个类似的问题:
考虑以下代码:structFoo{mutableintm;templatevoidchange_member()const{this->*member=12;//Error:youcannotassigntoavariablethatisconst}voidg()const{change_member();}};编译器生成一条错误消息。问题是成员m是可变的,因此允许更改m。但是函数签名隐藏了可变声明。如何对指向可变成员的指针进行decalre以编译这段代码?如果不可能,请链接到标准C++。 最佳答案 根据C++标准5.5/5,此代码
编辑-将问题置于上下文中。给定:structBase{...};structDerived:publicBase{...};classAlice{Alice(Base*const_a);...};classBob:publicAlice{Bob(Derived*const_a);...};当我尝试实现时Bob::Bob(Derived*const_d):Alice(static_cast(_d)){}它不起作用。const_cast对我来说没有意义,因为我不想更改常量,而且我没有更改我指向的内容,那么为什么g++会告诉我invalidstatic_castfromtype‘Derive
这两者有什么区别?当您需要固定大小的常量值数组时,您更喜欢哪一个?constboost::arrayx={0,1};boost::arrayy={0,1};谢谢。 最佳答案 第二个会阻止你将它复制到一个新的非常量数组boost::arrayy={0,1};boost::arrayy1=y;//error!因为我希望它能起作用,所以我可能会选择第一个选项。将第二个传递给需要boost::array的模板将防止这些模板修改它们的参数(即使它是一个拷贝)。第一个将“正常工作”,因为参数的类型为boost::array.
我必须使用带有整数(或枚举)键和字符串值的巨大字典。但这是完全不变的。无法在运行时更改。有没有办法(使用模板等)在编译时检索字典数据而不是使用现有的字典结构? 最佳答案 Clang和LLVM通过结合使用代码生成和预处理器技巧生成包含其对象的表来解决您的问题。您可以跳过任一步骤,具体取决于您自己的设置。例如://records.incEXPAND_RECORD(Foo,"Foo",4);EXPAND_RECORD(Bar,"Bar",18);EXPAND_RECORD(Bar2,"Bar",19);现在,您可以生成您的枚举://rec
我有一个类,它有一个方法,该方法对某些变量执行一些检查并返回一个值,并最终打印一条警告消息。由于该方法不会更改任何类变量,因此我将其定义为const。但是,为了避免淹没输出,我想在几次(或一次)打印后抑制警告打印。我一直无法找到保持方法const的解决方案,这可能(简单)吗? 最佳答案 使用mutable计数器怎么样?我认为,它应该是可以接受的,因为它不是对象状态,而是内部逻辑状态。像这样classPrinter{public:Printer():counter(0){}voidoutput()const{if(counter++L
我试图为此搜索答案,但我发现很难找到这种“确切”的例子。我对指向指针的指针知之甚少,我觉得除了指向某物的指针之外,还有更多东西隐藏在它的表层之下。那么你们会如何翻译呢?voidfree(shame_1*const*constgroup_1);如果我把它翻译成constgroup_1pointertoconstpointertoshame_1对吗?谢谢。 最佳答案 shame_1*const*constgroup_1;声明一个名为group_1的变量,其类型是一个常量指针(您不能更改它指向的位置)到另一个指向shame_1类型对象的常
我在YouTube上观看BjarneStroustrup,我试图弄清楚为什么这被认为是糟糕的,因为他说这是C++98风格的糟糕代码voidsetInt(constunsignedint&i)voidtakeaString(conststd::string&str)我的意思是你正在传递一个对常量的引用,这样你就可以省去复制操作,而且它甚至不像传递指针那样使用,所以它不必取消引用,所以为什么不好? 最佳答案 在C++11之前的版本中,一般的经验法则是如果您不修改参数,则按值传递内置类型,并按const&传递类或结构的对象,因为类或结构的
这个问题在这里已经有了答案:DoesC++11allowvector?(5个答案)关闭7年前。push_back按预期工作到非常量元素vector:std::vectorfoo;intbar=0;foo.push_back(bar);但为什么下面的不可能呢?std::vectorfoo;constintbar=0;foo.push_back(bar);更准确地说,为什么可以创建foo对象但不能对其调用push_back?
我有一个A类的对象在方法内部创建。此方法还创建对象的实例B将对象A作为构造函数参数刚刚创建。B必须取得对象的所有权A但它不能修改它。这意味着AB时应删除被删除,但在B的生命周期内它不能修改A.在本例中为std::unique_ptr作为B的成员变量是转移A所有权的正确方法(在std::move的构造函数中使用B)并保证它不会被修改? 最佳答案 是的,这正是您正在寻找的语义。std::unique_ptr声明“我拥有T对象。”指向constA的指针(原始或智能)声明“我无法修改我指向的A”。总而言之,这正是您所追求的。