抛弃方法的常量性
Casting away const-ness of method
作为我上一个问题 () 的后续,像这样抛弃 class 成员方法的常量性是否也定义明确且正确?
class A
{
public:
A()
: a(5)
{
}
int run() const
{
std::cout << "a: " << a << std::endl;
int& x = (int&)a;
x = 17;
std::cout << "a: " << a << std::endl;
return 0;
}
private:
int a;
};
int main()
{
A program;
return program.run();
}
输出(使用 c++14 在 cpp.sh 上使用 -O0、-Wall、-Wextra 和 -Wpedantic 进行测试):
a: 5
a: 17
如果不是,我会参考标准的哪一部分进行解释?
是的,你的代码是有效的,虽然不推荐,只要你开始的对象实例是非const
(在你的代码中就是这种情况,A program;
是非常量)。
从 const
实例中删除 const
-ness 是 UB(未定义行为)。从 casted-to-const
初始非 const
实例中删除 const
-ness 是明确定义的,参见例如const_cast
.
的文档
如果您确实需要从const
成员函数修改成员变量,请考虑将前者标记为mutable
。否则,只要有人(错误地)在 const
实例上调用您的成员函数,您当前的技术就会导致 UB。
作为我上一个问题 (
class A
{
public:
A()
: a(5)
{
}
int run() const
{
std::cout << "a: " << a << std::endl;
int& x = (int&)a;
x = 17;
std::cout << "a: " << a << std::endl;
return 0;
}
private:
int a;
};
int main()
{
A program;
return program.run();
}
输出(使用 c++14 在 cpp.sh 上使用 -O0、-Wall、-Wextra 和 -Wpedantic 进行测试):
a: 5
a: 17
如果不是,我会参考标准的哪一部分进行解释?
是的,你的代码是有效的,虽然不推荐,只要你开始的对象实例是非const
(在你的代码中就是这种情况,A program;
是非常量)。
从 const
实例中删除 const
-ness 是 UB(未定义行为)。从 casted-to-const
初始非 const
实例中删除 const
-ness 是明确定义的,参见例如const_cast
.
如果您确实需要从const
成员函数修改成员变量,请考虑将前者标记为mutable
。否则,只要有人(错误地)在 const
实例上调用您的成员函数,您当前的技术就会导致 UB。