[英]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);
調用未定義的行為,因為在foo
, a
最初是const
。
這在某些情況下很有用(通常在連接舊的C庫時),但在大多數情況下,您做錯了,應該重新考慮您的解決方案。
為了回答為什么const_cast<>
不是一個東西,我會說有兩個原因。 首先,當你做const_cast
你應該真正知道自己在做什么,如果允許某種模板扣除,那么就會更容易發生意想不到的錯誤。 其次const_cast
也可以用來刪除volatile
,編譯器怎么知道你想要拋棄什么?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.