b***i 发帖数: 3043 | 1 C++里面,如果有一个函数
const int foo()
{
return 5;
}
或者是一个对象
const Object bar()
{
...
}
这里const干啥用的?
我同事说只能赋值给常值变量,比如const int i = foo();但是我试了,好像可以随便。
我觉得他和 const Obj& obj = bar_();混了,如果是返回一个引用。这个时候我们不
希望变量随便改写引用的内容。 |
l*********s 发帖数: 5409 | |
w***g 发帖数: 5958 | 3 没见过const这么用的。如果是constexpr,则函数会在编译时被求知。
【在 b***i 的大作中提到】 : C++里面,如果有一个函数 : const int foo() : { : return 5; : } : 或者是一个对象 : const Object bar() : { : ... : }
|
h**l 发帖数: 168 | 4 to prevent assignment to bar() like bar() = Object();
typically this is used in operator methods like ++ (prevent a++++), + (
prevent a+b =c)
【在 b***i 的大作中提到】 : C++里面,如果有一个函数 : const int foo() : { : return 5; : } : 或者是一个对象 : const Object bar() : { : ... : }
|
b***i 发帖数: 3043 | 5 不用const也行吧?
比如
int foo()
{
return 5;
}
也不能foo()=6啊
我说过我理解const Obj& foo(),不理解const int foo()
【在 h**l 的大作中提到】 : to prevent assignment to bar() like bar() = Object(); : typically this is used in operator methods like ++ (prevent a++++), + ( : prevent a+b =c)
|
h**l 发帖数: 168 | 6 不用const对基本类型(比如 int)是可以,对user defined type, 如果你想避免这种奇
怪的assignment, 你需要return type加const. 当然如果你要支持move semantics,就
不要这样做。
我不是说return type是const Obj&这种情况, 是 Obj 或者 const Obj
【在 b***i 的大作中提到】 : 不用const也行吧? : 比如 : int foo() : { : return 5; : } : 也不能foo()=6啊 : 我说过我理解const Obj& foo(),不理解const int foo()
|
a9 发帖数: 21638 | 7 int a = foo();
a = 6; //这里会出异常? 我瞎猜的
【在 b***i 的大作中提到】 : 不用const也行吧? : 比如 : int foo() : { : return 5; : } : 也不能foo()=6啊 : 我说过我理解const Obj& foo(),不理解const int foo()
|
b*****e 发帖数: 474 | 8 foo 是一个返回 const int 的函数。
这 const 是多余的。因为return 的东西是 r-value, 本来就不能改。
如果是 const char * 或者 const char &, 这里的const 是修饰char, 而不是
整个return type, 所以不是多余的。
也可以写成 char const * 或者 char const &.
【在 b***i 的大作中提到】 : C++里面,如果有一个函数 : const int foo() : { : return 5; : } : 或者是一个对象 : const Object bar() : { : ... : }
|
h**l 发帖数: 168 | 9
For user-defined type, it is okay to assign to r-value, as the assignment
operator defined by the user may do something useful. It is probably not
a good practice though, but c++ standard committee may just want to allow
maximum flexibility.
Generally if we want to disable bizarre assignment statement like a+b=c or a
*b=c for user defined type, write operator+ (operator*) overload method to
return const. The disadvantage is that if a+b or a*b is used as a function
argument, they can not be bound to parameter of r-value reference type, thus
move is not allowed.
【在 b*****e 的大作中提到】 : foo 是一个返回 const int 的函数。 : 这 const 是多余的。因为return 的东西是 r-value, 本来就不能改。 : 如果是 const char * 或者 const char &, 这里的const 是修饰char, 而不是 : 整个return type, 所以不是多余的。 : 也可以写成 char const * 或者 char const &.
|
b***i 发帖数: 3043 | 10 明白了,多谢!
【在 h**l 的大作中提到】 : 不用const对基本类型(比如 int)是可以,对user defined type, 如果你想避免这种奇 : 怪的assignment, 你需要return type加const. 当然如果你要支持move semantics,就 : 不要这样做。 : 我不是说return type是const Obj&这种情况, 是 Obj 或者 const Obj
|
h**l 发帖数: 168 | 11 Another way to disable such bizarre assignment to r-value is to do the
following
MyClass& operator=(const MyClass& other) && = delete;
while at the same time allow move for r-value.
【在 b***i 的大作中提到】 : 明白了,多谢!
|
b***i 发帖数: 3043 | 12 = delete前面放个&& 这是个什么意思呢?
【在 h**l 的大作中提到】 : Another way to disable such bizarre assignment to r-value is to do the : following : MyClass& operator=(const MyClass& other) && = delete; : while at the same time allow move for r-value.
|
h**l 发帖数: 168 | 13 && means disable assignment for r-value
& means disable assignment for l-value
no & or && means disable assignment for both.
【在 b***i 的大作中提到】 : = delete前面放个&& 这是个什么意思呢?
|