const关键字的必要性是什么
what is const keyword necessary
我的代码不编译。
int foobar()
{
// code
return 5;
}
int main()
{
int &p = foobar(); // error
// code
const int& x = foobar(); //compiles
}
为什么添加关键字const会使代码编译?
在C++中,临时库不能绑定到非常量引用。
在中
int &p = foobar();
右值表达式foobar()
生成一个临时值,该临时值不能绑定到p
,因为它是一个非常量引用。
const int &x = foobar();
将临时附加到作为常量引用的x
可以延长其使用寿命。这是完全合法的。
因为foobar()
按值返回;这个结果是暂时的。不能有临时的非常量引用。
如果这不是真的,这个代码会做什么?
int &x = foobar();
x = 1; // Where are we writing to?
正如其他人所说,您可以接受对临时的const引用,但不能接受非const引用。
在实践中,允许非常量引用临时性会有危险:
#include <iostream>
void foo(int &i) {
i = 5;
}
int main() {
long l = 4;
foo(l);
std::cout << l << "n";
}
现在,l
可以隐式转换为int
,因此,如果这里允许对临时的非常数引用,那么可能会向foo
传递对该转换结果的引用,就像foo
取const int &
时一样。将对临时工进行分配,然后在临时工被销毁时丢弃。这更可能是一个令人困惑的错误,而不是预期的结果。
我不知道是否有一套整洁的规则可以在某些情况下允许对临时性的非常量引用,但在危险/烦人的情况下不允许,但即使是这样,C++标准也不包括它们。请注意,C++0x具有右值引用,它允许您使用临时变量做一些在C++03中无法完成的额外事情。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 当我们已经有 char[] 时,在 c++ 中字符串的必要性是什么?
- 在此C 代码中指针的必要性是什么?
- 在类映射中,当我们有迭代器时,constiterator的必要性是什么
- 实现纯虚函数的必要性是什么
- 视觉 C++当我们在基类中使函数成为纯虚拟时,那么在子类中再次使相同的函数虚拟的必要性是什么
- const关键字的必要性是什么