视觉C++,需要错误原因:无法将参数 1 从 'char *' 转换为 'const char *&'
visual C++, Need Reason for error : cannot convert parameter 1 from 'char *' to 'const char *&'
为什么不能将指向字符的指针->转换为指向常量字符的指针的引用
我很想知道当我们调用foo_ptr时语法错误的原因。当允许foo_char时,为什么不允许foo_ptr呢?
(更新1。我很高兴知道foo_char()
起作用的原因,为什么foo_ptr()
不起作用…当指针出现在图片中会发生什么?
(更新2。)
//code
//OS : Win XP
//Env: VC++ 2008
//NOT ALLOWED
void foo_ptr(const char * & ptr) //reference to a pointer to a constant character
{
return;
}
//allowed
void foo_char(const char & p_Char) //reference to a constant character
{
return;
}
int main()
{
char ch = 'd';
char *ptr = "anu";
foo_char(ch);
foo_ptr(ptr); //NOT ALLOWED syntax error, vc++, 2008
return 0;
}
假设你有
void foo_ptr(const char * & ptr)
{
ptr = "readonlystring";
}
你现在叫它
char *ptr;
foo_ptr(ptr);
*ptr = 0;
假设没有抛出错误。您正在写入一个只读字符串,在没有任何强制转换的情况下违反了类型系统。
这基本上是CV版本的:为什么派生类的指针不能传递给期望引用基类指针的函数?
用更多的例子修改:Raymond Chen提供了正确答案。通过传递一个非const指针(char *
)作为const指针(foo_ptr(const char * ¶m)
)的引用参数,你可能会返回一个const指针类型(const char *
),编译器不会允许你这样做。
下面是Raymond Chen的例子,但是我试图通过添加额外的注释和代码来解释编译时会出现什么问题:
void foo_ptr(const char * & ptr)
{
//Valid assignment, and the char * is now pointing to a const
//array of "readonlystring"
ptr = "readonlystring";
}
...
//inside main
char *ptr = malloc(10*sizeof(char));
//See you can edit ptr, it's not const.
ptr[0] = 'a';
ptr[1] = 'b';
//this should not compile, but lets assume it did..
foo_ptr(ptr);
//Oh no, now ptr[0] is 'r' inside of constant memory,
//but now since ptr isn't declared const here I can overwrite it!
//But luckily most (all?) compilers actually fail to compile this code.
ptr[0] = 'b';
但是如果你改变形参,使你不能影响指针指向的值,那么编译器会让你传递一个非const,因为没有机会返回const值的指针。
通过将关键字const
放在参数减速中的*
之后,您可以做到这一点。这意味着改变:
void foo_ptr(const char * & ptr)
void foo_ptr(const char * const & ptr)
,你的编译器会很高兴。
现在您将无法执行上面示例中的ptr = "readonlystring"
,因为它现在永远不会编译。根据你的问题,这应该是OK的,因为你将无法在你的原始示例中对const char &
进行分配。
永远不要将字符串文字赋值给非const
char
指针,就像下面这样:
char *ptr = "anu";
将上面的代码改为正确的代码:
const char *ptr = "anu";
…我想你会发现你的问题都解决了。
- 在字符串函数中抛出'char const*'实例后调用的终止
- 双重标准?为什么只有 char* const&a = "bla" 的警告?
- 包括"lvtocon.h",未定义对'operator<<(std::ostream&, char const*)的引用
- 为什么 const char* const & = 可以编译"hello"?
- 将字符串文本常量定义为 char const* 和 wchar const*
- 如何将std::wstring转换为char const[]
- "char const * name() const _WEBSOCKETPP_NOEXCEPT_TOKEN_ {"剂量是什么意思
- 使用提升对字符串进行标记化时,将令牌转换为 char* const* 时失败
- 如何从 std::initializer_list<char const* 构建 std::vector<std::string>>
- 将 std::vector<std::string> 转换为 const char* const*
- 引发"char const*"错误的实例后调用的终止
- 将const char * const参数成员分配给新值
- 从'const char**'到'char* const*'的转换无效
- 从 sub_match<常量字符 *>' 转换为'const char *const &'
- char*const和constchar*之间有什么区别?(重复-需要更多澄清)
- 使用工厂方法时编译器错误:无法转换"const std::p air<char* const
- HEVC 解码器端口 Android 警告:从 'signed char*' 到 'char const* 的转换无效*
- 如何从'char const*'中删除常量
- 'char const *str'作为模板参数
- 为什么不;t strlen(.)应为const char*const str,而不是const char*