1

这个问题是关于我在const_cast制作char * 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 正确性的理解,我可以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

你不需要 aconst_cast<>来做一些 const 的东西,你只需要它来消除 const-ness。

另外,我根本不相信您拥有的代码是正确的,因为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 回答