为什么这里需要"const":VS C2664
Why "const" is needed here: VS C2664
我从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" ?
(这些LPCSTR
/LPSTR
的类型名只会混淆代码。)
你在这里遇到的问题可以用以下简洁的方式表达
char *p = NULL;
const char *&r = p; // ERROR
这段代码不能编译的原因和你的原始版本不能编译的原因是一样的:这样的引用初始化在c++中是非法的。在您的示例中,相同的初始化在函数参数初始化中隐式使用(当从func2
调用func1
时),而在我的示例中,它是显式完成的。
不合法的原因与c++(和C)中T**
-> const T**
转换不合法的原因大致相同。这是一个旧的FAQ: 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++中是合法的一样(参见FAQ条目),T**
-> const T* const&
初始化也是合法的
char *p = 0;
const char *const &r = p; // OK
在该代码示例中,将生成C2664,因为代码试图将对指针的引用转换为对const指针的引用。这是两回事
允许将指针转换为const引用(const LPSTR&)
LPCSTR定义为"typedef CONST CHAR *LPCST"和LPCST定义为typepedef CHAR *LPCST
正如您所看到的,LPCSTR是const而LPSTR不是,所以这两种类型是不同的,因此您需要在上下文中使用const。
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 正在VS调试器中监视映射条目
- Confusion: decltype vs std::function
- 将IBM Rhapsody模型集成到VS 2019中
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- 修改 VS Code 中的默认C++代码段
- 如何使用c++在VS 2019上运行SQL查询
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 完美前进使用 std::forward vs RefRefCast
- VS 2017 错误 C2664 地图插入尝试
- 在 sniffer.h libtins 上获取 VS C2664
- VS 2013 C++ 中的错误 c2664
- VS错误C2664(从函数返回字符串)c++
- 为什么这里需要"const":VS C2664
- 当试图将.c文件编译为.cpp时,VS 2013错误C2664