标签: const

C++ 11 Const引用VS移动语义

我想知道在C++ 11中我还需要在参数中使用const引用.我不完全理解移动语义,但我认为这是一个合法的问题.此问题仅适用于const引用替换正在进行的副本而仅需要"读取"该值(例如const成员函数的使用)的情况.

通常我会写一个(成员)函数,如下所示:

#include <vector>

template<class T>
class Vector {
    std::vector<T> _impl;
public:
    void add(const T& value) {
         _impl.push_back(value);
    }
};
Run Code Online (Sandbox Code Playgroud)

但是我认为可以安全地假设编译器会使用移动语义来优化它,如果我这样写它并且class Tofcourse实现了一个移动构造函数:

#include <vector>

template<class T>
class Vector {
    std::vector<T> _impl;
public:
    void add(T value) {
         _impl.push_back(value);
    }
};
Run Code Online (Sandbox Code Playgroud)

我对吗?如果是这样,假设它可以在任何情况下使用是否安全?如果没有,我想知道哪个.这将使生活变得更加容易,因为我不必为基本类型实现类专门化,例如,它看起来更清晰.

const move-semantics c++11

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

如何将std :: vector的大小作为int?

我试过了:

#include <vector>

int main () {
    std::vector<int> v;
    int size = v.size;
}
Run Code Online (Sandbox Code Playgroud)

但得到了错误:

cannot convert 'std::vector<int>::size' from type 'std::vector<int>::size_type (std::vector<int>::)() const noexcept' {aka 'long unsigned int (std::vector<int>::)() const noexcept'} to type 'int'
Run Code Online (Sandbox Code Playgroud)

将表达式转换为int如下:

#include <vector>

int main () {
    std::vector<int> v;
    int size = (int)v.size;
}
Run Code Online (Sandbox Code Playgroud)

也会产生错误:

error: invalid use of member function 'std::vector<_Tp, _Alloc>::size_type std::vector<_Tp, _Alloc>::size() const [with _Tp = int; _Alloc = std::allocator<int>; std::vector<_Tp, _Alloc>::size_type = long unsigned int]' (did you forget the '()' …
Run Code Online (Sandbox Code Playgroud)

c++ size const vector unsigned-integer

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

const函数/方法签名后的含义是什么?

根据MSDN:"当跟随成员函数的参数列表时,const关键字指定该函数不会修改调用它的对象."

有人可以澄清这一点吗?这是否意味着该函数无法修改任何对象的成员?

 bool AnalogClockPlugin::isInitialized() const
 {
     return initialized;
 }
Run Code Online (Sandbox Code Playgroud)

c++ const

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

不同编译器中的pure/const函数属性

pure是一个函数属性,表示函数不会修改任何全局内存.
const是一个函数属性,表示函数不读取/修改任何全局内存.

鉴于该信息,编译器可以进行一些额外的优化.

GCC示例:

float sigmoid(float x) __attribute__ ((const));

float calculate(float x, unsigned int C) {
    float sum = 0;
    for(unsigned int i = 0; i < C; ++i)
        sum += sigmoid(x);
    return sum;
}

float sigmoid(float x) { return 1.0f / (1.0f - exp(-x)); }
Run Code Online (Sandbox Code Playgroud)

在该示例中,编译器可以将函数计算优化为:

float calculate(float x, unsigned int C) {
    float sum = 0;
    float temp = C ? sigmoid(x) : 0.0f;
    for(unsigned int i = 0; i < C; ++i)
        sum …
Run Code Online (Sandbox Code Playgroud)

c++ gcc const function-attributes

32
推荐指数
2
解决办法
8710
查看次数

"const"只是意味着只读还是更多?

什么是const真正的意思?只读似乎包含了它对我的意义,但是,我不确定我是对的.

如果只读且const不同,有人可以告诉我为什么吗?

提出这个问题的原因是这个答案,他说const"只是"在C语中是只读的.我认为这一切都 const意味着,无论是C还是C++.他什么意思?

为了回答constC与C++中的具体差异,我创建了一个新问题:"const"在C和C++中有何不同?按照R ..的建议.

c c++ const

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

const向量意味着const元素?

是否const vector<A>意味着它的元素也是const如此?

在下面的代码中,

v[0].set (1234); in void g ( const vector<A> & v ) 产生编译器错误

const.cpp:28:3:错误:成员函数'set'不可行:'this'参数的类型为'const value_type'(又名'const A'),但函数未标记为const

为什么?

(*v[0]).set(1234);void h ( const vector<A *> & v ) 是编译器确定.

版本之间有什么区别?

// ...........................................................
class A {
private:
  int a;
public:
  A (int a_) : a (a_) { }
  int get () const { return a; }
  void set (int a_) { a = a_; }
};

// ...........................................................
void g ( const vector<A> & …
Run Code Online (Sandbox Code Playgroud)

c++ const

32
推荐指数
4
解决办法
3万
查看次数

为什么const int main = 195导致一个工作程序,但没有const它会以分段错误结束?

考虑使用C程序(请参阅此处的实时演示).

const int main = 195;
Run Code Online (Sandbox Code Playgroud)

我知道在现实世界中没有程序员编写这样的代码,因为它没有任何用处,也没有任何意义.但是当我const从程序上方删除关键字时,它会立即导致分段错误.为什么?我很想知道这背后的原因.

GCC 4.8.2在编译时会发出以下警告.

警告:'main'通常是一个函数[-Wmain]

const int main = 195;
          ^
Run Code Online (Sandbox Code Playgroud)

为什么const关键字的存在和缺失会对程序的行为产生影响?

c program-entry-point const segmentation-fault

32
推荐指数
2
解决办法
3958
查看次数

C问题:(const void*)vs(void*)

const void *和之间有什么区别void *?在什么情况下可以将void指针强制转换为const void指针?

c pointers const

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

模板参数中"T"和"const T"之间有什么区别吗?

以下2种语法之间有什么区别:

template<int N> struct A;         // (1)
Run Code Online (Sandbox Code Playgroud)

template<const int N> struct A;   // (2)
Run Code Online (Sandbox Code Playgroud)

何时使用每种语法的一般准则?

c++ syntax templates const

31
推荐指数
2
解决办法
2756
查看次数

常量和不带相同的功能 - 何时以及为何?

T& f() { // some code ... }
const T& f() const { // some code ... }
Run Code Online (Sandbox Code Playgroud)

我现在已经看过几次了(在我迄今为止研究的介绍性书中).我知道第一个const使返回值为const,换句话说:不可修改.我相信第二个const允许为const声明的变量调用该函数.

但是为什么你会在同一个类定义中同时拥有这两个函数?编译器如何区分这些?我相信第二个f()(带const)也可以调用非const变量.

c++ const

31
推荐指数
4
解决办法
5556
查看次数