我从MSDN
复制代码它说“在Visual C ++ 2005中,编译器现在强制执行应用const的C ++标准要求。以下示例生成C2664。”
// C2664d.cpp
// C2664 expected
#include <windows.h>
void func1(LPCSTR &s)
{
}
void func2(LPSTR &s)
{
func1(s);
}
int main()
{
return 0;
}
为什么我需要在这里使用“const”?
答案 0 :(得分:4)
(那些LPCSTR
/ LPSTR
类型名称只会混淆代码。)
您在这里遇到的问题可以用以下简洁的方式表达
char *p = NULL;
const char *&r = p; // ERROR
由于原始版本无法编译的原因与此代码无法编译:此类引用初始化在C ++中是非法的。在您的示例中,在函数参数初始化中隐式使用相同的初始化(从func1
调用func2
时),而在我的示例中,它是显式完成的。
它是非法的原因几乎与T**
- &gt;相同。 {C}(和C)中的const T**
转换是非法的。这是一个旧的常见问题解答: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` !!!
意味着它允许我们在没有任何“黑客攻击”的情况下破坏const正确性规则,即不使用单个强制转换。这在C ++(以及C语言)中被认为是不可接受的,这就是T **
- >转换的原因。 const T **
和初始化,例如T *&
- &gt; <{1}}是不被允许的。
另请注意,就像const T *&
- &gt; T**
转换在C ++中是合法的(请参阅常见问题解答条目),const T* const*
- &gt; T**
初始化也是合法的
const T* const&
答案 1 :(得分:1)
在该代码示例中,将生成C2664,因为代码正在尝试将对指针的引用转换为对const指针的引用。这是两件不同的事情。
允许转换为指针的const引用(const LPSTR&amp;)。
答案 2 :(得分:1)
LPCSTR定义为“typedef CONST CHAR * LPCST”和 LPSTR定义为“typedef CHAR * LPCST”
正如您所看到的,LPCSTR是const而LPSTR不是,因此这两种类型是不同的,因此您需要在上下文中使用const。