1

この質問はconst_castchar * const char *. このキャストは暗黙的に行われ、キャストが暗黙的に行われているときにうまく機能することを認識しています。

問題のあるコードは次のとおりです。

#include <cstdlib>
int main() {
    const char * org_str = NULL;
    org_str = const_cast<const char*>(getenv("ENV_VAR")); // PROBLEM !!
}

Linux のマニュアル ページ にあるように、getenv()const char *受け取って返しますchar*。したがって、const-correctness に関する私の理解によればchar*、問題なく const キャストを実行できます。

それで、私の質問は、なぜconst_castここで私にUBを与えているのですか(コードがクラッシュしています)が、予想通りconst_cast(暗黙のキャスト)なしで正常に動作します(したがって、問題は の使用にある必要がありますconst_cast) ?

注意してください、私は暗黙のキャストがここに行く方法であることを知っています.

編集:

このバグは仲間の So'ers では再現できないため、これはランタイム/コンパイラの奇妙な問題であると想定しています。ただし、このような問題が標準に記載されている場合はお知らせください。

当分の間、私はマイクの答えを受け入れています。

4

3 に答える 3

3

関数によって返されるポインターではなく、関数ポインターをキャストしています。最初に () で関数を呼び出し、次に結果をキャストします。

編集:問題を再現できません。使用したコードは次のとおりです。

#include <cstdlib>
#include <iostream>

using namespace std;
int main() {
    const char * org_str = NULL;
    org_str = const_cast<const char*>(getenv("PATH"));
    cout << "Got: " << org_str << endl;
}

これが私が得たものです:

$ g++ foo.cc -o foo.app
$ ./foo.app
Got: /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/usr/X11R6/bin
$

ところで、NULL への割り当ては不要です。次のいずれかを使用することをお勧めします。

const char *org_str = const_cast<const char*>(getenv("PATH"));

const char *org_str(const_cast<const char*>(getenv("PATH")));

const char *org_str(getenv("PATH"));
于 2012-02-08T05:24:46.030 に答える
2

const_cast<>何かを const にするのには必要ありません。const らしさを取り除くためだけに必要です。

getenvまた、関数であり、変数として使用しているように見えるため、そこにあるコードがまったく正しいとは思いません。おそらく、次のようなものが機能します。

const char * org_str = getenv("name-of-env");
于 2012-02-08T05:25:27.373 に答える
0

私が理解している限りでは、キャストすべき getenv の戻り値ではなく、あなたが持っている const char です。org_str は定数であるため、const_cast を使用せずに代入することはできません。つまり、次のようにする必要があります。

#include <cstdlib>
int main() {
    const char * org_str = NULL;
    const_cast<char*>(org_str) = getenv("ENV_VAR"); // NO PROBLEM !!
}

編集: getenv で const_cast を使用することに関しては、それに代入しないため意味がありません。そのため、const 式に違反することはありません。

org_str = getenv("ENV_VAR") will give you.
于 2012-02-08T08:02:48.260 に答える