Visual C 2017和gcc 5.4生成从“const unsigned char”到“const float”的转换需要对以下代码段中的
警告,但对B行
发出缩小转换a行
则不发出警告:
#include <iostream>
int main() {
const unsigned char p = 13;
const float q = p; // Line A
std::cout << q << '\n';
const unsigned char c[3] = {0, 1, 255};
const float f[3] = {c[2], c[0], c[1]}; // Line B
for (auto x:f)
std::cout << x << '\n';
}
此警告是否有效?为什么B线
的处理方式与A线
不同?
警告是有效的,从C 11缩小转换在聚合初始化中被禁止;但不应用于复制初始化(和以前一样)。
如果初始值设定项子句是表达式,则根据复制初始化<code>允许隐式转换,除非它们正在缩小(如在列表初始化中)(从C 11开始)。</code>
在C11之前,聚合初始化中允许缩小转换,但不再允许。
和
list初始化通过禁止以下内容来限制允许的隐式转换:
顺便说一句:c[0]
、c[1]
和c[2]
不是常量表达式;您可以将数组声明为的
,即的
无符号字符c[3]={0,1,255};
。然后应用异常,B行也可以正常工作。
问题内容: 我试图将const char *传递给从Swift中的Swift字符串转换而来的旧C库。 这是我正在调用的C函数: 如何将Swift字符串转换为这种const char类型?当我像这样传递ipAddress时,它可以工作: 但是当我这样通过时dit不起作用 我在需要指定类型的函数中需要它: 我尝试使用AnyObject而不是String,但这也不起作用。 谢谢。 问题答案: 不知道为什
我在尝试编写一个Arduino程序来读取通过串行连接处理发送的命令时遇到了一个小问题。处理应该通过串行连接向Arduino发送“H”或“L”。这个值在我的程序中以字符的形式存储,但当我尝试进行串行操作时。写入(“值:%c,val)”时,出现“从'const char*'到'const uint8_t*'的无效转换”错误。如果有人能帮我解决这个问题,那就太好了。我真的需要弄清楚这个值是什么,这样我才
我试图使用std::cout打印一组对,但它没有编译。我在Xcode9上使用C++14。错误发生在行 错误:二进制表达式(“ostream”(又名“basic_ostream”)和“const value_type”(又名“const std::__1::pair”)的操作数无效)
我想创建一个简单的3x3矩阵类,并能够通过下标操作符访问其内容。代码如下: 我希望能够访问数组的元素,无论矩阵的对象是常量还是非常量。但我从编译器中得到以下错误: 错误:从“const int*”到“int*”的转换无效[-fpermissive] 我做了一些研究,我有一个假设:也许,因为我已经将这个成员函数声明为const函数,在它的定义中,编译器将对象的所有不可变成员视为const成员(它掩盖
我在编译代码时遇到了问题。 我从http://www.cplusplus.com/reference/algorithm/all_of/?kw=all_of.拿了密码 我正在使用代码::块12.11,我有以下错误: C:\用户\PC-HP\桌面\chiffre\romain\main.cpp||在实例化的'boolall_of(InputIterator,InputIterator,UnaryPr
我在写JNI。在这种情况下,我的Java程序使用ByteOutputStream()获取一个图像字节数组,然后用这个数组调用C中的一个函数,将字节数组转换为无符号char*。代码如下: 在这一点上,当我编译时,我不断收到警告: 警告:使用“jbyte *”类型的表达式(也称为“signed char *”)初始化“unsigned char *”会在指向具有不同符号[-Wpointer-sign]