我想知道在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)
我对吗?如果是这样,假设它可以在任何情况下使用是否安全?如果没有,我想知道哪个.这将使生活变得更加容易,因为我不必为基本类型实现类专门化,例如,它看起来更清晰.
我试过了:
#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) 根据MSDN:"当跟随成员函数的参数列表时,const关键字指定该函数不会修改调用它的对象."
有人可以澄清这一点吗?这是否意味着该函数无法修改任何对象的成员?
bool AnalogClockPlugin::isInitialized() const
{
return initialized;
}
Run Code Online (Sandbox Code Playgroud) 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) 什么是const真正的意思?只读似乎包含了它对我的意义,但是,我不确定我是对的.
如果只读且const不同,有人可以告诉我为什么吗?
提出这个问题的原因是这个答案,他说const"只是"在C语中是只读的.我认为这一切都 const意味着,无论是C还是C++.他什么意思?
为了回答constC与C++中的具体差异,我创建了一个新问题:"const"在C和C++中有何不同?按照R ..的建议.
是否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 int main = 195;
Run Code Online (Sandbox Code Playgroud)
我知道在现实世界中没有程序员编写这样的代码,因为它没有任何用处,也没有任何意义.但是当我const从程序上方删除关键字时,它会立即导致分段错误.为什么?我很想知道这背后的原因.
GCC 4.8.2在编译时会发出以下警告.
警告:'main'通常是一个函数[-Wmain]
Run Code Online (Sandbox Code Playgroud)const int main = 195; ^
为什么const关键字的存在和缺失会对程序的行为产生影响?
const void *和之间有什么区别void *?在什么情况下可以将void指针强制转换为const void指针?
以下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)
何时使用每种语法的一般准则?
T& f() { // some code ... }
const T& f() const { // some code ... }
Run Code Online (Sandbox Code Playgroud)
我现在已经看过几次了(在我迄今为止研究的介绍性书中).我知道第一个const使返回值为const,换句话说:不可修改.我相信第二个const允许为const声明的变量调用该函数.
但是为什么你会在同一个类定义中同时拥有这两个函数?编译器如何区分这些?我相信第二个f()(带const)也可以调用非const变量.