首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这里需要"const“:VS C2664

为什么这里需要"const“:VS C2664
EN

Stack Overflow用户
提问于 2011-04-21 14:51:03
回答 3查看 1.3K关注 0票数 1

我从MSDN复制代码

它说“在Visual C++ 2005中,编译器现在强制执行应用常量的C++标准要求。下面的示例生成C2664。”

代码语言:javascript
复制
// C2664d.cpp
// C2664 expected
#include <windows.h>

void func1(LPCSTR &s)
{

}

void func2(LPSTR &s)
{
   func1(s);
}

int main()
{
   return 0;
}

为什么我需要在这里使用const?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-21 15:10:43

(那些LPCSTR/LPSTR类型名称只会混淆代码。)

您在这里遇到的问题可以用以下简洁的方式来表示

代码语言:javascript
复制
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

基本上,如果上面示例中的初始化是合法的,则可以继续执行以下操作序列

代码语言:javascript
复制
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&初始化也是合法的

代码语言:javascript
复制
char *p = 0;
const char *const &r = p; // OK
票数 4
EN

Stack Overflow用户

发布于 2011-04-21 14:58:26

在该代码示例中,将生成C2664,因为代码试图将对指针的引用转换为对常量指针的引用。这是两件不同的事情。

允许转换为指向指针(const LPSTR&)的常量引用。

票数 1
EN

Stack Overflow用户

发布于 2011-04-21 15:15:00

LPCSTR定义为“defined CONST CHAR *LPCST”,LPSTR定义为“defined *LPCST”

正如您所看到的,LPCSTR是const,而LPSTR不是,因此这两种类型是不同的,因此您需要在上下文中使用const。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5740578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档