草庐IT

constness

全部标签

C++ 临时对象绑定(bind)到参数和返回值 const 引用

即使查看了有关SO的相关问题并阅读了C++03标准第192页(http://cs.nyu.edu/courses/fall11/CSCI-GA.2110-003/documents/c++2003std.pdf),我也无法清楚地知道这是否合法。这是否合法且安全:constMyClass&f(constMyClass&arg){returnarg;}voidsome_other_function(){constMyClass&reference=f(MyClass());//Usereference.}在我看来是这样的。 最佳答案 据

c++ - 有时为 const 的成员函数

我有一个类似于以下的类设计:classMyClass{public:boolIsValid()const;voidMakeValid();private:boolCheckValidity(boolfix);};boolMyClass::IsValid()const{//Checkvalidity,butdon'tfixanyproblemsfound.Doesn'twork.returnCheckValidity(false);}voidMyClass::MakeValid(){//Checkvalidityandfixproblemsfound.CheckValidity(true

c++ - const_iterator 和 const_iterator::value_type 的 constness

为什么在STL中std::iterator_traits::value_type与类型相同std::iterator_traits::value_type为什么要这样设计?第一个不应该是constT,第二个不应该是T吗?您应该如何采用迭代器的底层const正确类型?我知道您可以编写自己的模板类和特化并从中获取它std::iterator_traits::pointer但是不应该有一个成员typedef来保存它吗? 最佳答案 常量对于值类型无关紧要,因为值意味着一个拷贝。std::iterator_traits::reference是

c++ - const 成员函数和非常量成员函数有什么区别?

我对const版本和非常量版本的成员函数很困惑,如下所示:value_type&top(){returnthis.item}constvalue_type&top()const{returnthis.item}这两个函数有什么区别?会在什么情况下使用? 最佳答案 简而言之,它们用于为您的程序添加“常量正确性”。value_type&top(){returnthis.item}这用于提供对item的可变访问。它用于修改容器中的元素。例如:c.top().set_property(5);//OK-setsapropertyof'item

c++ - const 和非常量函数的重载是如何工作的?

STL充满了这样的定义:iteratorbegin();const_iteratorbegin()const;由于返回值不参与重载决议,这里唯一的区别是函数是const。这是重载机制的一部分吗?编译器的解析算法是什么:vector::const_iteratorit=myvector.begin(); 最佳答案 在你给出的例子中:vector::const_iteratorit=myvector.begin();如果myvector不是const,则将调用begin()的非const版本,您将依赖从迭代器到const_iterato

c++ - 头文件中的 const 变量和静态初始化失败

在阅读了很多关于静态变量初始化的问题后,我仍然不确定这如何适用于命名空间级别的const变量。我在构建脚本生成的header文件config.h中有以下代码:staticconststd::stringpath1="/xyz/abc";staticconststd::stringpath2="/etc";根据我阅读的内容,static关键字不是必需的,甚至在此处已弃用。我的问题:上面的代码是否容易出现静态初始化失败?如果我在header文件myclass.h中有以下内容:classMyClass{public:MyClass(conststd::string&str):m_str(st

c++ - std::set 迭代器自动 const

这个问题在这里已经有了答案:关闭10年前.PossibleDuplicate:C++STLsetupdateistedious:Ican'tchangeanelementinplace为了简单起见,我已经提取了问题并更改了名称。基本上我实例化一个类并将其存储在std::set中,稍后我想引用该类,以便我可以检查它的值并修改它们...简化代码:MyClasstmpClass;std::setsetMyClass;setMyClass.insert(tmpClass);std::set::iteratoriter;iter=setMyClass.begin();MyClass&tmpCla

c++ - 既然字符串文字被认为是左值,为什么绑定(bind)左值引用必须是 const?

我知道已经有类似的主题(例如this)。本主题中给出的示例是这样的:std::string&rs1=std::string();很明显,std::string()是一个右值。但是,我的问题是为什么s1合法而s2不合法?conststd::string&s1="Stringliteral";std::string&s2="Stringliteral";该标准明确指出字符串文字是左值(这是可以理解的,因为它们在技术上是constchar*在幕后)。但是,当我编译s2时,我得到以下信息:prog.cpp:4:19:error:invalidinitializationofnon-constr

c++ - 从 const 映射中读取的惯用 C++

对于std::mapvariables,我想这样做:BOOST_CHECK_EQUAL(variables["a"],"b");唯一的问题是,在这种情况下variables是const,所以operator[]不会工作:(现在,有几种解决方法;抛弃const,使用variables.count("a")?variables.find("a")->second:std::string()甚至制作一个包装它的函数。在我看来,这些都没有operator[]好。.我应该怎么办?有没有标准的方法(漂亮地)?编辑:只是为了说明你们都不想给出的答案:不,在C++中没有方便、美观、标准的方法来做到这一

c++ - 为什么 std::distance 不适用于 const 和非 const 迭代器的混合?

这个问题在这里已经有了答案:autoit=vector.begin()resultingtypeisnotconvertibletoconst_iterator(3个回答)关闭6年前。就像问题所说的那样,我想知道其中的原因。因为当我尝试获取const和非const迭代器之间的距离时出现错误。vectorv;autoit=v.begin();autocit=v.cbegin();distance(it,cit);nomatchingfunctionforcallto‘distance(__gnu_cxx::__normal_iterator>&,__gnu_cxx::__normal_i