簡體   English   中英

const_cast的自動類型扣除不起作用

[英]Automatic type deduction with const_cast is not working

在我的工作中, const_cast的使用在某些情況下是不可避免的。

現在我必須const_cast一些相當復雜的類型,實際上我不想在const_cast<Clutter>表達式中編寫所有這種類型的混亂,特別是如果Clutter非常長。

我最初的想法是寫const_cast<>(myType)但我的編譯器無法推導出非const類型myType 所以我想幫助我的編譯器和我編寫以下方法,編譯。

#include <stdlib.h>
#include <iostream>

int main(int, char**) {
    const int constVar = 6;
    using T = typename std::remove_cv<decltype(constVar)>::type;
    auto& var = const_cast<T&>(constVar);
    var *= 2;
    std::cout << &constVar << " " << &var << "\n"; // Same address!
    std::cout << constVar << " " << var << "\n";
    return EXIT_SUCCESS;
}

不幸的是,程序給了我輸出6 12而不是預期的6 6 ,我真的不明白?

我的做法有什么問題?

const_cast的文檔:

const_cast使得形成對非const類型的引用或指針成為可能,實際上是指const對象或實際引用易失性對象的非易失性類型的引用或指針。 通過非const訪問路徑修改const對象並通過非易失性glvalue引用volatile對象會導致未定義的行為。

所以你擁有的是未定義的行為。

同樣令人感興趣的是來自cv類型限定符的這個注釋。

const對象 - 類型為const限定的對象,或const對象的不可變子對象。 無法修改此類對象:嘗試直接執行此操作是編譯時錯誤,並嘗試間接執行此操作(例如,通過引用或指向非const類型的指針修改const對象)會導致未定義的行為。

如果你有

void foo(const int& a)
{
    const_cast<int&>(a) = 4;
}

然后

int a = 1;
foo(a);

是完全合法的,但是

const int a = 1;
foo(a);

調用未定義的行為,因為在fooa最初是const

這在某些情況下很有用(通常在連接舊的C庫時),但在大多數情況下,您做錯了,應該重新考慮您的解決方案。

為了回答為什么const_cast<>不是一個東西,我會說有兩個原因。 首先,當你做const_cast你應該真正知道自己在做什么,如果允許某種模板扣除,那么就會更容易發生意想不到的錯誤。 其次const_cast也可以用來刪除volatile ,編譯器怎么知道你想要拋棄什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM