此问题与我在使用const_cast
制作char *
const char *
时所观察到的行为有关。我知道这个演员是隐式完成的,并且 t 在演员隐式完成时为我工作。
有问题的代码是:
#include <cstdlib>
int main() {
const char * org_str = NULL;
org_str = const_cast<const char*>(getenv("ENV_VAR")); // PROBLEM !!
}
根据Linux man page getenv()
获取const char *
并返回char*
。所以,根据我对const-correctness的理解,我可以在char*
上做一个const cast而不会有任何问题。
所以,我的问题是,为什么const_cast
在这里给我一个UB(代码崩溃),但正如预期没有const_cast
(隐式转换)它的工作正常(所以问题必须在于使用const_cast
)?
请注意,我知道隐式演员是这里的方式,通过这篇文章,我需要专门针对此处观察到的行为的答案。
编辑:
由于这些错误是由其他Soerers无法重现的,我假设这是一些奇怪的运行时/编译器问题。但是,如果标准中有任何类似问题的提及,请告诉我。
暂时我接受迈克的回答。
答案 0 :(得分: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"));
答案 1 :(得分:2)
你不需要const_cast<>
来制作const,你只需要它来取消常量。
此外,我不相信你在那里的代码是正确的,因为getenv
是一个函数,看起来你正在将它用作变量。也许这样的事情会起作用:
const char * org_str = getenv("name-of-env");
答案 2 :(得分: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.