标签: const

总是在C++ 11中声明std :: mutex是可变的吗?

在看了Herb Sutter的演讲" 你不知道const和mutable"之后,我想知道我是否应该总是将互斥量定义为可变的?如果是的话,我想同样适用于任何同步容器(例如tbb::concurrent_queue)?

一些背景:在他的演讲中,他说const == mutable == thread-safe,并且std::mutex每个定义都是线程安全的.

关于这个话题也有相关的问题,const在C++ 11中是否意味着线程安全.

编辑:

在这里,我发现了一个相关的问题(可能是重复的).不过,它在C++ 11之前被问过.也许这会产生影响.

c++ const mutable thread-safety c++11

36
推荐指数
3
解决办法
1万
查看次数

为什么将"指向非const的指针"转换为"指向const的指针"是不合法的

合法的指针到非const转换为指针到常量.

那么为什么将指向非const指针转换为指向const指针是不合法的呢?

例如,为什么以下代码是非法的:

char *s1 = 0;
const char *s2 = s1; // OK...
char *a[MAX]; // aka char **
const char **ps = a; // error!
Run Code Online (Sandbox Code Playgroud)

c++ pointers const const-correctness

35
推荐指数
5
解决办法
5875
查看次数


为什么C++没有const构造函数?

(编辑:重大改变,因为前面的例子是有缺陷的,这可能会使一些答案/评论看起来很奇怪)

这可能是一个过于设计,但由于缺少const构造函数,以下是合法的:

class Cheater
{
public:
    Cheater(int avalue) 
       : cheaterPtr(this) //conceptually odd legality in const Cheater ctor
       , value(avalue) 
    {}

    Cheater& getCheaterPtr() const {return *cheaterPtr;}
    int value;

private:
    Cheater * cheaterPtr;
};

int main()
{
    const Cheater cheater(7); //Initialize the value to 7

    cheater.value                 = 4;    //good, illegal
    cheater.getCheaterPtr().value = 4;    //oops, legal

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

似乎提供const构造函数在技术上就像const方法一样容易,并且类似于const重载.

注意:我不是在寻找' Image( const Data & data ) const'而是' const Image( const Data & data) const'

所以:

  • 为什么const构造函数在C++中不存在?

这是上下文的一些相关材料:

c++ constructor const

35
推荐指数
3
解决办法
2万
查看次数

"const class"是什么意思?

在找到并替换重构之后,我最终得到了这个gem:

const class A
{
};
Run Code Online (Sandbox Code Playgroud)

"const class"是什么意思?好像编译好了.

c++ const class

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

C++"const"关键字解释

在阅读用C++编写的教程和代码时,我经常偶然发现const关键字.

我看到它使用如下:

const int x = 5;
Run Code Online (Sandbox Code Playgroud)

我知道这意味着它x是一个常量变量,可能存储在只读内存中.

但究竟是什么

void myfunc( const char x );
Run Code Online (Sandbox Code Playgroud)

int myfunc( ) const;
Run Code Online (Sandbox Code Playgroud)

c++ const constants

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

const成员和赋值运算符.如何避免未定义的行为?

回答了关于std :: vector of objects和const-correctness的问题,得到了不应有的 downvote和关于undefined行为的评论.我不同意,因此我有一个问题.

考虑使用const成员的类:

class A { 
public: 
    const int c; // must not be modified! 
    A(int c) : c(c) {} 
    A(const A& copy) : c(copy.c) { }     
    // No assignment operator
}; 
Run Code Online (Sandbox Code Playgroud)

我想要一个赋值运算符,但我不想const_cast在下面的代码中使用其中一个答案:

A& operator=(const A& assign) 
{ 
    *const_cast<int*> (&c)= assign.c;  // very very bad, IMHO, it is undefined behavior
    return *this; 
} 
Run Code Online (Sandbox Code Playgroud)

我的解决方案是

A& operator=(const A& right)  
{  
    if (this == &right) return *this;  
    this->~A() 
    new (this) A(right); …
Run Code Online (Sandbox Code Playgroud)

c++ const undefined-behavior assignment-operator

33
推荐指数
3
解决办法
2万
查看次数

const成员函数可以返回一个非const指针指向数据成员吗?

代码优先:

class A
{
    public:
        ...
        int *foo() const
        {
            return _px;
        }
    private:
        int *_px;
}
Run Code Online (Sandbox Code Playgroud)

成员函数foo返回一个非const的指向private成员的指针_px,我想这会打开修改成员的大门_px,对吧?

foo一个const成员函数?我应该const在返回类型前添加一个吗?

UPDATE

const-member-function应该保证的是,它不能改变任何数据成员,对吧?

在我的例子中,函数foo没有打开修改class A数据成员_px的大门,而是修改_px指向的内容,所以我的问题是,这是否违反了const函数应该保证的内容?

c++ const

33
推荐指数
3
解决办法
1万
查看次数

我应该使用const作为局部变量来进行更好的代码优化吗?

我经常使用const未修改的局部变量,如下所示:

const float height = person.getHeight();
Run Code Online (Sandbox Code Playgroud)

我认为它可以使编译后的代码更快,允许编译器进行更多优化.或者我错了,编译器可以自己弄清楚局部变量永远不会被修改?

c++ optimization performance const compiler-optimization

33
推荐指数
2
解决办法
9822
查看次数

Rust中的immutable和const变量有什么区别?

我了解到,如果变量未使用显式声明为可变mut,则变为不可变(在声明后不能更改).那为什么我们const在Rust中有关键字?他们不一样吗?如果没有,它们有何不同?

const immutability rust

33
推荐指数
5
解决办法
5474
查看次数