考虑以下初始化:
std::string falseString = false;
std::string trueString = true;
在g 5.2.0中,编译器对falseString发出警告,而对trueString发出错误。
使用clang 3.6-std=c 11时,编译器会对假字符串和真字符串抛出错误。
Q1)为什么gcc
的行为不同,即使两个初始化值是相同的类型(bool
)?
Q2)哪个编译器是正确的,为什么?标准怎么说?
编辑:
错误:从“bool”到“std::string”(又名“basic\u string”)没有可行的转换
警告:将'false'转换为'std::参数1的指针类型__cxx11::basic_string
首先,您绝对不能从true
初始化std::字符串
。这是荒谬的。
GCC 5.2接受来自false的初始化,但表示抗议,因为它过去是一个有效的空指针文本。是 啊比较C 03和C 11之间的3.9.1/6-“如下所述,布尔值表现为整数类型”已删除。
如今,它应该在两个编译器上都出错,但直到一个月前(所以是GCC 6.0),GCC在这方面一直存在错误。
以下节目 使用当前Clang(12.0.0)编译,但不使用当前GCC(11.0.0 20201028)。使用GCC它会产生错误 根据[dcl.init.list/5]和string_view(char const*)构造函数是constepr这一事实,我假设Clang的行为就在这里。 对吗?
如果String和其他类一样,那么如何使用双引号初始化它?
问题内容: 如果String和其他字符串一样是一个类,如何使用双引号将其初始化? 问题答案: Java的设计者决定保留面向对象语言中的原始类型,而不是将所有内容都变成对象,以提高语言的性能。原语存储在调用堆栈中,这需要较少的存储空间,并且操作成本较低。另一方面,对象存储在程序堆中,这需要复杂的内存管理和更多的存储空间。 出于性能原因,Java的String设计为介于基本体和类之间。 例如 注意:
我以前见过这样做,但我不记得如何有效地初始化已知长度的与长度相同的。这里有一个很好的例子: 我已经仔细阅读了这一页关于高级矩阵初始化的内容,但是没有明确解释执行此操作的方法。
以下代码无法在 GCC 4.7.2 或 Clang 3.2 中编译: 问题在于编译器将尝试使用initializer_list创建b,而显然它应该只是调用复制构造函数。然而,这似乎是期望的行为,因为标准说initializer_list构造函数应该优先。 此代码适用于其他 std::vector,但对于 std::函数,编译器无法知道您是需要initializer_list构造函数还是另一个构造函
问题内容: 我知道对于上面的第3个初始化,字符串对象在字符串池中初始化,而第4个与字符串池无关。 1.和2有 什么区别?如果我将其视为指针变量,它存储的是特定内存地址,而该内存地址从未被JVM或OS使用? 4.和5 之间有区别吗? 当我打印和通过直接和,对,我甚至无法通过compilation.For ,编译OK,我得到“空”,并在控制台窗口中的输出。为什么? @aioobe的答案后编辑:更多问题