我有这个代码: class A { public: A() = default; private: int i = 1; }; int main() { const A a; return 0; } 它在g ++(见ideone )上编译得很好,但在clang ++上失败,出现错误: consttypes“const A”的对象的默认初始化需要用户提供的默认构造函数 我在LLVM bug跟踪器上报告了这个问题,并将其视为无效。 我认为试图说服铿锵的开发者绝对毫无意义。 另一方面,我看不出这种限制的原因。 任何人都可以build议,如果C ++ 11标准莫名其妙地暗示此代码是无效的? 或者我应该只是向g ++报告错误? 或者,也许在语言规则方面有足够的自由来处理这些代码?
默认情况下 ,从getter函数返回副本(1)或引用(2)会更好吗? class foo { public: std::string str () { // (1) return str_; } const std::string& str () { // (2) return str_; } private: std::string str_; }; 我知道2)可能会更快,但不必由于(N)RVO。 1)对于悬挂引用是比较安全的,但是对象可能会死亡或者引用永远不会被存储。 当你写一个class级的时候,你的默认设置是什么,而且还不知道性能和生命期问题是否重要? 额外的问题:当成员不是一个普通的string,而是一个vector时,游戏是否会改变?
一个相当理论上的问题……为什么常量引用的行为和常量指针不一样,我实际上可以改变它们指向的对象呢? 他们看起来像另一个简单的variables声明。 为什么我会用它们? 这是一个简单的例子,我运行编译和运行没有错误: int main (){ int i=0; int y=1; int&const icr=i; icr=y; // Can change the object it is pointing to so it's not like a const pointer… icr=99; // Can assign another value but the value is not assigned to y… int x=9; icr=x; cout<<"icr: "<<icr<<", y:"<<y<<endl; }
在写下面的函数abs ,我得到错误: 非成员函数unsigned int abs(const T&)不能有cv-qualifier。 template<typename T> inline unsigned int abs(const T& t) const { return t>0?t:-t; } 删除该const限定符后,没有错误。 由于我不修改t里面的上面的代码应该编译。 我想知道为什么我得到错误?
我知道经验法则是从右至左阅读声明,而且我确信自己知道发生了什么,直到一位同事告诉我: const MyStructure** ppMyStruct; 意思是“ppMyStruct是指向一个(可变的)MyStructure的常量指针的指针 ”(在C ++中)。 我会认为这意味着“ppMyStruct是一个指向常量MyStructure的指针 ”。 我在C ++规范中寻找答案,但显然我不是很擅长这个… 在C ++中意味着什么,在C中意味着什么?
我一直在教C ++编程类多年,向学生解释的一个最棘手的问题是const重载。 我通常使用向量类的例子和它的operator[]函数: template <typename T> class Vector { public: T& operator[] (size_t index); const T& operator[] (size_t index) const; }; 我很难解释为什么需要两个版本的operator[]函数,但是在试图解释如何将两个实现结合在一起时,我经常发现自己浪费了大量的语言arcana。 问题是,我知道如何以另一种方式实现这些函数之一的唯一好的,可靠的方法是使用const_cast / static_cast技巧: template <typename T> const T& Vector<T>::operator[] (size_t index) const { /* … your implementation here … */ } template <typename T> T& Vector<T>::operator[] (size_t index) { return const_cast<T&>(static_cast<const Vector&>(*this)[index]); } […]
我有一些特定的代码的麻烦,如果任何人都可以在这个问题上给我启发,这将不胜感激,我已经隔离了下面的示例中的问题: #include <iostream> using namespace std; class testing{ int test(); int test1(const testing& test2); }; int testing::test(){ return 1; } int testing::test1(const testing& test2){ test2.test(); return 1; } 那么可能会导致以下错误: test.cpp:15:error:作为'int testing :: test()'的'this'parameter passing'const testing'会丢弃限定符 非常感谢!
在代码审查过程中,我的一位同事向我提到,在头部用作函数参数的“原始types”之前的“const”是毫无意义的,他build议删除这些“const”。 在这种情况下,他build议只在源文件中使用“const”。 原始types是指诸如“int”,“char”,“float”等的types 以下是例子。 example.h文件 int ProcessScore(const int score); example.cc int ProcessScore(const int score) { // Do some calculation using score return some_value; } 他的build议是这样做的: example.h文件 int ProcessScore(int score); // const is removed here. example.cc int ProcessScore(const int score) { // Do some calculation using score return some_value; } 但是我有些困惑。 通常情况下,用户只看标题,所以如果标题和源文件不一致,可能会造成混淆。 任何人都可以提供一些build议吗?
我想知道之间的区别 const int* ptr; 和 int * const ptr; 以及它如何工作。 我很难理解或记住这一点。 请帮忙。
我在Stroustrup的书中find了这个代码: void print_book(const vector<Entry>& book) { for (const auto& x : book) // for "auto" see §1.5 cout << x << '\n'; } 但是const似乎是多余的,因为x会被推断为一个const_iterator因为book在参数中是const的。 const auto是否真的更好?