我从MSDN复制代码
它说“在Visual C++ 2005中,编译器现在强制执行应用常量的C++标准要求。下面的示例生成C2664。”
// C2664d.cpp
// C2664 expected
#include <windows.h>
void func1(LPCSTR &s)
{
}
void func2(LPSTR &s)
{
func1(s);
}
int main()
{
return 0;
}为什么我需要在这里使用const?
发布于 2011-04-21 15:10:43
(那些LPCSTR/LPSTR类型名称只会混淆代码。)
您在这里遇到的问题可以用以下简洁的方式来表示
char *p = NULL;
const char *&r = p; // ERROR这段代码不能编译的原因与原始版本不能编译的原因完全相同:这种引用初始化在C++中是非法的。在您的示例中,相同的初始化在函数参数初始化中隐式使用(当从func2调用func1时),而在我的示例中,它是显式完成的。
它是非法的原因与T** -> const T**转换在C++ (和C)中是非法的几乎是一样的。这是一个古老的常见问题解答:http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.17。
基本上,如果上面示例中的初始化是合法的,则可以继续执行以下操作序列
const char cc = 0;
r = &cc; // OK. Note: `p` now points to `cc`!
*p = 1; // !!! Attempts to modify `cc` !!!这意味着它将允许我们在没有任何“hack”的情况下打破常量正确性规则,即不使用单个强制转换。这在C++ (以及C)中被认为是不可接受的,这就是不允许像T ** -> const T **这样的转换和像T *& -> const T *&这样的初始化的原因。
另请注意,就像T** -> const T* const*转换在C++中是合法的(请参阅常见问题解答条目)一样,T** -> const T* const&初始化也是合法的
char *p = 0;
const char *const &r = p; // OK发布于 2011-04-21 14:58:26
在该代码示例中,将生成C2664,因为代码试图将对指针的引用转换为对常量指针的引用。这是两件不同的事情。
允许转换为指向指针(const LPSTR&)的常量引用。
发布于 2011-04-21 15:15:00
LPCSTR定义为“defined CONST CHAR *LPCST”,LPSTR定义为“defined *LPCST”
正如您所看到的,LPCSTR是const,而LPSTR不是,因此这两种类型是不同的,因此您需要在上下文中使用const。
https://stackoverflow.com/questions/5740578
复制相似问题