に関する情報があまり見つかりませんconst_cast
。(Stack Overflowで)私が見つけた唯一の情報は次のとおりです。
const_cast<>()
/変数の削除CONST(ネス)(又は揮発性らしさ)を追加するために使用されます。
これは私を緊張させます。const_cast
原因の予期しない動作を使用できますか?もしそうなら、何ですか?
または、いつ使用しても大丈夫const_cast
ですか?
に関する情報があまり見つかりませんconst_cast
。(Stack Overflowで)私が見つけた唯一の情報は次のとおりです。
const_cast<>()
/変数の削除CONST(ネス)(又は揮発性らしさ)を追加するために使用されます。
これは私を緊張させます。const_cast
原因の予期しない動作を使用できますか?もしそうなら、何ですか?
または、いつ使用しても大丈夫const_cast
ですか?
回答:
const_cast
元々でなかった変数をキャストする場合にのみ安全ですconst
。たとえば、のパラメータを取る関数がありconst char *
、変更可能なを渡す場合char *
、const_cast
そのパラメータをに戻しchar *
、変更しても安全です。ただし、元の変数が実際const
にだった場合、使用const_cast
すると未定義の動作が発生します。
void func(const char *param, size_t sz, bool modify)
{
if(modify)
strncpy(const_cast<char *>(param), sz, "new string");
printf("param: %s\n", param);
}
...
char buffer[16];
const char *unmodifiable = "string constant";
func(buffer, sizeof(buffer), true); // OK
func(unmodifiable, strlen(unmodifiable), false); // OK
func(unmodifiable, strlen(unmodifiable), true); // UNDEFINED BEHAVIOR
§7.1.5.1/4 says Except that any class member declared mutable (7.1.1) can be modified, any attempt to modify a const object during its lifetime (3.8) results in undefined behavior
どんな試みでも!元の変数についての言葉はありません。
const_cast
const
const
const_cast
const_castが安全で便利な2つの状況を考えることができます(他にも有効なケースがあるかもしれません)。
1つは、constインスタンス、参照、またはポインターがあり、constが正しくないAPIにポインターまたは参照を渡したいが、CERTAINがオブジェクトを変更しない場合です。ポインターをconst_castしてAPIに渡すと、実際には何も変更されません。例えば:
void log(char* text); // Won't change text -- just const-incorrect
void my_func(const std::string& message)
{
log(const_cast<char*>(&message.c_str()));
}
もう1つは、「可変」を実装していない古いコンパイラーを使用していて、論理的には定数であるがビット単位の定数ではないクラスを作成する場合です。constメソッド内で 'this'をconst_castして、クラスのメンバーを変更できます。
class MyClass
{
char cached_data[10000]; // should be mutable
bool cache_dirty; // should also be mutable
public:
char getData(int index) const
{
if (cache_dirty)
{
MyClass* thisptr = const_cast<MyClass*>(this);
update_cache(thisptr->cached_data);
}
return cached_data[index];
}
};
const_cast
、それがどのように役立つのかではなく、未定義の動作を引き起こす可能性があるかどうか尋ねました
const_cast
有効な答えです。he
質問だけが主題なので、質問はありません。
それがconst_castについて見つけられる唯一の情報であるとは信じがたいです。2番目のGoogleヒットからの引用:
constとして明示的に宣言されているオブジェクトのconstnessをキャストして変更しようとすると、結果は定義されません。
ただし、constとして明示的に宣言されていないオブジェクトのconstnessをキャストする場合は、安全に変更できます。
const_cast
。または、その上でconstメソッドを呼び出します。
アダムが言うこと。const_castが役立つ別の例:
struct sample {
T& getT() {
return const_cast<T&>(static_cast<const sample*>(this)->getT());
}
const T& getT() const {
/* possibly much code here */
return t;
}
T t;
};
私たちは、第一種へのconstを追加しthis
、その後、我々はのconstのバージョンを呼び出すにポイントgetT
して、私たちは以来、有効な戻り値の型からのconstを削除するt
それ以外の非constバージョンは(非constでなければならないgetT
ことができませんでした呼ばれた)。これは、大きな関数本体があり、冗長なコードを避けたい場合に非常に役立ちます。
const_cast
またはstatic_cast
より良いです。const_cast
あなたがしたいことだけができます:cv-qualifiersを変更してください。static_cast
意図しない他の操作を「サイレント」で実行できます。ただし、最初のキャストは完全に安全であり、static_cast
より安全である傾向がありますconst_cast
。これはconst_cast
あなたの意図をよりよく伝えますが、static_cast
あなたの行動の安全性をよりよく伝えている状況だと思います。
コンパイラがconstであると考えていたものを変更し始めた場合、スレッドセーフでチャンスを破壊しています。
const
。 const
信頼です。const_cast
その信頼を破っています:(
#include <iostream>
using namespace std;
void f(int* p) {
cout << *p << endl;
}
int main(void) {
const int a = 10;
const int* b = &a;
// Function f() expects int*, not const int*
// f(b);
int* c = const_cast<int*>(b);
f(c);
// Lvalue is const
// *b = 20;
// Undefined behavior
// *c = 30;
int a1 = 40;
const int* b1 = &a1;
int* c1 = const_cast<int*>(b1);
// Integer a1, the object referred to by c1, has
// not been declared const
*c1 = 50;
return 0;
}
ソース:http : //publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fkeyword_const_cast.htm
const
オブジェクトを変更しようとした場合にのみ、危険になりconst
ます。代わりに、const_cast
非const
参照のみを受け入れ、const
メソッドでのみ使用される、不十分な(または、私の場合は、遅延した)仕様のAPIを回避するだけの場合...まったく問題ありません。