[英]Is the following use of const_cast undefined behavior?
這是一個語言律師問題,而不是一個好的練習題。
以下代碼是有效還是未定義的行為? const對象最終調用非const函數,但它實際上並不修改對象的狀態。
struct Bob
{
Bob() : a(0) {}
int& GetA()
{
return a;
}
const int& GetA() const
{
return const_cast<Bob&>(*this).GetA();
}
int a;
};
int main()
{
const Bob b;
int a = b.GetA();
}
行為定義明確:
C ++標准,第5.2.11 / 7節[const cast]
[注意:根據對象的類型,通過指針,左值或指向數據成員的指針的寫入操作會導致const-qualifier的const_cast,這可能會產生未定義的行為。 - 尾注]
GetA()
不會寫任何Bob
成員,因此該程序不涉及未定義的行為。
我相信它是定義明確的,因為標准僅歸因於修改 const
對象的未定義行為。 C ++ 11引用如下:
[expr.const.cast]5.2.11§7
[ 注意:根據對象的類型,通過指針,左值或指向數據成員的指針的寫入操作會導致const-qualifier的
const_cast
產生未定義的行為(7.1.6.1)。 - 尾注 ]
[dcl.type.cv]7.1.6.1§4
除了可以修改聲明為
mutable
(7.1.1)的任何類成員之外,任何在其生命周期內修改const
對象的嘗試(3.8)都會導致未定義的行為。 ...
GetA()
實際上並沒有修改任何對象,因此它沒有未定義的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.