标签: const-correctness

如何仅将基类公开为 const 引用

我希望我的类仅Foo将其基类公开Bar为对Bar. 这意味着 的成员Bar可以读取,但不能设置。这是我尝试过的:

struct Bar
{
    int member;
};

class Foo : protected Bar
{
public:
    operator const Bar&() { return *this; }
};
Run Code Online (Sandbox Code Playgroud)

但在使用时,会出现以下问题:

int getBarMember( const Bar& bar )
{
    return bar.member;
}

int main()
{
    Foo myFoo;

    const Bar& refBar = myFoo; // C2243
    // const Bar& refBar = (const Bar&) myFoo; // always need to cast explicitly

    int read = refBar.member;

    int readByFunction = getBarMember( myFoo ); // …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance const-correctness

5
推荐指数
1
解决办法
133
查看次数

使用指向const对象的静态指针数组来混淆const正确性

我仍然不确定我是否完全了解这个特殊情况应如何解决.因此,如果我想声明一个不会改变的NSStrings数组,这是正确的吗?

static NSString * const strings[] = {@"String 1", @"String 2", ...};
Run Code Online (Sandbox Code Playgroud)

static必要吗?(它做了什么?)我错过了一个额外的const地方吗?这里有太多的地方了!尔加!我做错了,还是我只是偏执狂?

c static const const-correctness objective-c

4
推荐指数
1
解决办法
1596
查看次数

这段代码在C++中是否合法

我刚刚发现,当涉及到模板时,这个代码在g ++ 3.4.2中编译,并且除非不调用m(),否则它可以工作:

template <typename T>
class C
{
     T e;

     public:
        C(): e(0) {};

    void m()
    {
        e = 0;
    };
 };
Run Code Online (Sandbox Code Playgroud)

现在可以创建和使用实例

C<const int> c;
Run Code Online (Sandbox Code Playgroud)

直到c.m()没有被称为没有编译错误,但这是合法的吗?

c++ templates const const-correctness

4
推荐指数
1
解决办法
251
查看次数

为什么"gptr"类型为basic_streambuf char_type*而不是const char_type*?

basic_streambuf设置streambuf的三个"gptrs" 的成员setg被声明为:

protected:
  void setg(char_type *gback, char_type *gptr, char_type *egptr);
Run Code Online (Sandbox Code Playgroud)

我想知道:为什么每个gptr的类型char_type*而不是const char_type*const_cast在这里使用const char指针这些gptrs 是否安全?

c++ iostream const-correctness streambuf

4
推荐指数
1
解决办法
461
查看次数

我们如何在const-member函数中调用"delete this;"?

我看到代码片段如下:

class UPNumber {
public:
  UPNumber();
  UPNumber(int initValue);
  ...

  // pseudo-destructor (a const member function, because
  // even const objects may be destroyed)
  void destroy() const { delete this; } // why this line is correct???

  ...

private:
  ~UPNumber();
};
Run Code Online (Sandbox Code Playgroud)

首先,我确信上面的类定义是正确的.这是我的问题,为什么我们可以像上面那样定义函数'destroy'?问的原因是为什么我们可以在const-member函数中修改'this'?

c++ const-correctness delete-operator

4
推荐指数
2
解决办法
1070
查看次数

函数参数中的struct关键字和const-correctness

我的库中有一个opaque类型定义为:

typedef struct MyOpaqueType* MyType;  // easier to type for client code
Run Code Online (Sandbox Code Playgroud)

我不能使用typedef传递一个指向const的指针结构,所以有些函数看起来像:

void UsePointerToConst ( const struct MyOpaqueType * )
Run Code Online (Sandbox Code Playgroud)

代替:

void UserPointerToConst( const MyType ) // can't use, is really constant pointer
Run Code Online (Sandbox Code Playgroud)

所以,鉴于此,我有两个问题:参数列表中的struct关键字只在C中是必需的吗?有一个更好的方法吗?我应该创建一个typedef,例如:

typedef const struct MyOpaqueType* ConstantMyType; ?
Run Code Online (Sandbox Code Playgroud)

c c++ const-correctness

4
推荐指数
1
解决办法
2400
查看次数

inout-parameter - 将一个const-handle替换为另一个const-handle

在一个对象中,我有一个const-handle数组到另一个特定类的某个对象.在方法中,我可能希望将此句柄之一作为inout参数返回.这是一个简化的例子:

class A {}

class B {
    const(A) a[];
    this() { 
        a = [new A(), new A(), new A()];
    }

    void assign_const(const(A)* value) const {
        // *value = a[0]; // fails with: Error: cannot modify const expression *value
    }
}
void main() {
    const(A) a;
    B b = new B();
    b.assign_const(&a);
    assert(a == b.a[0]); // fails .. obviously
}
Run Code Online (Sandbox Code Playgroud)

我不想删除原始数组中的const.类B是指对集合常量的某种视图 - A项.我是来自C++的D新手.我是否在D-way中搞乱了const-correctness?我已经尝试了几种方法让它工作,但不知道如何正确.

如果没有"邪恶"的投射,如何正确执行此查找?

pointers casting d const-correctness const-cast

4
推荐指数
1
解决办法
102
查看次数

参考成员是否良好做法?是const会员吗?

一位同事和我正在讨论const或参考成员是否是正确的事情.const和引用成员使类不可复制且不可移动,除非您编写自己的副本并移动忽略引用或const成员的运算符.我找不到一个忽略复制或移动某些成员只是因为它们是引用或const有意义的情况.

我认为拥有一个不可移动的对象很少在逻辑上是合理的,并且是一个选择,它只与该类是否是位置不变有关.不可复制的对象更常见,但是使类不可复制的选择与它是否拥有逻辑上不可复制的资源,如果它代表唯一的所有权等有关.我想不出一个理由的唯一特征是拥有引用或const成员是否意味着该类具有这些特征中的任何一种(不可复制或不可复制)

他们应该曾经被使用?应该是一个而不是另一个吗?有什么例子?

c++ const reference const-correctness

4
推荐指数
1
解决办法
315
查看次数

无法将const应用于typedef引用

如果我使用相同类型的typedef,则以下代码在应用于const返回值引用时会起作用,value_type&但会出现错误.

举个例子:

class T {
};

class A {
public:
    typedef T value_type;
    typedef value_type& reference;

    // Not working
    const reference operator*() const;

    // But this works?
    //const value_type& operator*() const;
};

// Error!
const typename A::reference A::operator*() const {
}

int main() {
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

g ++会出错:

'const' qualifiers cannot be applied
Run Code Online (Sandbox Code Playgroud)

我的实际代码使用模板,但我删除了示例和替换类T.这与错误无关.

我不明白为什么这不起作用如果指定value_type&编译好.

c++ const const-correctness

4
推荐指数
1
解决办法
1445
查看次数

在 const 对象上调用非常量函数

我正在阅读 C++ Primer 第 5 版第 258 页。问题是,const 对象能否调用其非常量成员函数,即使该成员函数不修改其数据?

销售数据.h

#include <iostream>
#include <string>

struct Sales_data {
    // data members
    std::string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;

    // memeber functions
    const std::string isbn() const { return bookNo; }
    Sales_data& combine(const Sales_data&);
    double avg_price() const { // *
        if (units_sold) {
            return revenue / units_sold;
        }
        return 0.0;
    }
};

std::ostream& print(std::ostream &os, const Sales_data& data) {
    os << data.isbn() << " " << data.units_sold << " " …
Run Code Online (Sandbox Code Playgroud)

c++ constants const-correctness member-functions c++11

4
推荐指数
1
解决办法
1119
查看次数