为什么需要“const”:VS C2664

时间:2011-04-21 06:51:03

标签: c++ visual-studio const msdn

我从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”?

3 个答案:

答案 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。