问题描述
在此示例中,c样式是否强制转换为 int&
,然后进行分配以对类型为 A的接口进行黑客入侵
未定义行为?
In this example, is the c-style cast to int&
followed by an assignment to kind of hack the interface of class A
undefined behavior?
class A
{
public:
A()
: x(0)
{
}
~A()
{
std::cout << x << std::endl;
}
const int& getX()
{
return x;
}
private:
int x;
};
int main()
{
A a;
int& x = (int&)a.getX();
x = 17;
std::cout << x << std::endl;
}
输出:
17
17
如果是这样,什么部分我可以参考哪些标准?另外,有没有任何理由为什么不进行警告而进行编译? (我在cpp.sh上使用c ++ 14在-Wall,-Wextra和-Wpedantic上进行了测试)
If so, what part of the standard can i refer to? Also, is there any reason why this compiles without warnings? (i tested with c++14 on cpp.sh with -Wall, -Wextra and -Wpedantic)
推荐答案
const int& getX() { return x; }
由于此方法未标记为const,因此x是可变int。将引用并转换为const int& amp;。在返回点。请注意,尽管引用是const int,但实际的引用int是可变的。这很重要。
Since this method is not marked const, x is a mutable int. A reference is taken and cast to a const int& at the point of return. Note that although the reference is to a const int, the actual referee int is mutable. This is important.
int& x = (int&)a.getX();
此行采用返回的const int引用和 const_cast
将其引用为int引用。这在c ++中是合法的,句号是句号。 [expr.const.cast]
This line takes the returned const int reference and const_cast
's it to an int reference. This is legal in c++, full stop. [expr.const.cast]
但是,仅当所引用的原始对象是可变的时,通过此引用编写才是合法的。
However, writing through this reference is only legal if the original object being referenced is mutable.
在这种情况下就是这样。
In this case, it is.
您将在 [dcl.type.cv]中找到详细信息
这篇关于通过const&写给班级成员的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!