Stroustrup先生在他的新书(TCPL第4版)的第149页上写了以下内容
1 <= sizeof(wchar_t) <= sizeof(long)
Run Code Online (Sandbox Code Playgroud)
我在标准中找不到任何支持上述不等式的内容.我可以这样说sizeof(bool) <= sizeof(long).
编辑:3.9.1p5 你会发现:
类型wchar_t应具有与其他整数类型之一相同的大小,符号和对齐要求(3.11),称为其基础类型.
这支持了不平等
sizeof(wchar_t) <= sizeof(long long)
Run Code Online (Sandbox Code Playgroud)
但不是
sizeof(wchar_t) <= sizeof(long)
Run Code Online (Sandbox Code Playgroud)
但我找不到任何确认的东西
sizeof(bool) <= sizeof(long)
Run Code Online (Sandbox Code Playgroud) core constant expression在C++ 11标准(N3690)的最新草案中有11个对表达式的引用,它们都没有定义这个实体是什么.
人们还可以发现这里的表达式core constant expression定义很好,基本上与标准用于定义表达式的术语相同.conditional-expression
因此,我想在这个问题上获得一些意见,在我看来,这个问题在标准中是错误的.
现在,假设cppreference中的定义是正确的,我还想知道为什么下面的代码片段在Coliru和Ideone中编译,尽管在提到的定义中有第(10)项?
#include <iostream>
int main()
{
const double x = 2.;
constexpr double y = x;
std::cout << y << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我特别考虑表达式中lvalue to rvalue implicit conversion的变量,而上述第(10)项中的任何条款(a),(b)和(c)都没有涵盖这一点.xconstexpr double y = x;
谢谢您的帮助.
此代码不在Coliru中编译,尽管它似乎符合iso§5.19p2第9个子弹点和iso§3.9p10,即,S是文字类型,因此,S a(1);应该被视为常量表达式.特别是,iso§3.9p10项目符号第3点没有说明有关联合成员的任何内容.
#include <iostream>
struct S
{
int i;
float x;
constexpr S(int j) : i{j} {}
};
int main()
{
constexpr S a(1);
}
Run Code Online (Sandbox Code Playgroud) 在friend以下功能不受普通查找(§7.3.1.2/ 3)发现,但是由ADL(§3.4.2/ 4第二个项目符号点)发现,所以代码编译和正常执行(活例子).但是该函数f未在任何名称空间中声明.例如,如果您尝试f(x);通过任何这些调用替换调用::f(x);,A::f(x);或者A::X::f(x);代码将无法编译.哪个命名空间确实包含此友元函数的声明?标准是否对此有所说明?
#include <iostream>
namespace A {
class X {
int i;
friend void f(X x) { std::cout << x.i << '\n'; }
public:
X():i(101){}
};
}
int main()
{
A::X x;
f(x);
}
Run Code Online (Sandbox Code Playgroud) 我不明白这个缺陷报告1207的原因,更具体地说是参考下面的句子(重点是我的):
因为将成员名称转换为类成员访问表达式(9.3.1 [class.mfct.non-static]段落3)仅发生在非静态成员函数的主体内部,所以尾随中的v的类型 - return-type是非const,但在返回表达式中是const,导致返回表达式和函数的返回类型之间的类型不匹配.
编辑
也就是说,我不明白为什么尾随返回类型中的v的类型被推断为非const.
我正在阅读Nicolai Josuttis撰写的第二版"标准图书馆".在第183页我们有:
使用无序地图和Multimaps的示例
提出了179页的屈德宁的例子也适用于一个无序多重映射如果更换
map由unordered_map在include指令,并multimap通过unordered_multimap在容器的声明:Run Code Online (Sandbox Code Playgroud)#include <unordered_map> ... unordered_multimap<int,string> coll; ...唯一的区别是元素的顺序是不确定的. 但是,在大多数平台上,元素仍将被排序,因为作为默认哈希函数,使用模运算符.
我粗略地强调了我不清楚的部分.当我读到这篇文章时,我的第一印象是作者说两个程序(第179页中的一个,见下文)和上面的程序都应该在大多数平台上以相同的顺序打印城市的名称.但这不会发生在clang和GCC中.看到活生生的实例map,并unordered_map在海湾合作委员会.在clang中获得相同的结果.
经过一段时间的思考,我解释了作者的说法,几乎所有平台都以相同的顺序打印城市的名称,当用a处理时unordered_map,输出似乎证实了这一点.但即便如此,我也很难接受这种解释,因为不同的实现可能会使用不同的哈希函数!
下面,您将在上面提到的第179页中找到示例:
#include <map>
#include <string>
#include <iostream>
using namespace std;
int main()
{
multimap<int,string> coll; // container for int/string values
// insert some elements in arbitrary order
// - a value with key 1 gets inserted twice
coll = { {5,"tagged"},
{2,"a"},
{1,"this"},
{4,"of"},
{6,"strings"},
{1,"is"},
{3,"multimap"} };
// print all element …Run Code Online (Sandbox Code Playgroud) 从§5.3.5[expr.delete]/1,我可以理解,该对象的析构函数*a是未在下面的代码段调用.但我不明白为什么B在这种情况下调用类成员的析构函数,如本实例中所示.
#include <iostream>
class A
{
public:
class B{ public: ~B(){ std::cout << "B dtor" << '\n'; } };
A() { p = new B(); }
operator B*() { return p; }
private:
B* p;
};
int main()
{
A* a = new A();
delete *a;
std::cout << "end" << '\n';
}
Run Code Online (Sandbox Code Playgroud)
非常感谢标准中的一些引用解释这一点.
以下代码正常执行(请参见此处):
#include <iostream>
struct A {
int i;
A():i(1){}
operator int&() { return i; }
};
int& rri = A();
int main()
{
int& ri = A();
std::cout << ri << '\n';
std::cout << rri << '\n';
}
Run Code Online (Sandbox Code Playgroud)
它打印
1
1
Run Code Online (Sandbox Code Playgroud)
正如所料.但是,如果我在main()中注释掉前两个语句,则只留下
std::cout << rri << '\n';
Run Code Online (Sandbox Code Playgroud)
代码打印0.
编辑:
我们假设问题出在我的代码中.但后来我问:标准中8.5.3/5中第三个要点的目的是什么,我在下面复制了:
对类型"cv1 T1"的引用由类型"cv2 T2"的表达式初始化,如下所示:
如果引用是左值引用和初始化表达式
是左值(但不是位域),"cv1 T1"与"cv2 T2"引用兼容,或者
具有类类型(即,T2是类类型),其中T1与T2不是引用相关的,并且可以转换为类型为"cv3 T3"的左值,其中"cv1 T1"与"cv3"引用兼容T3"(通过枚举适用的转换函数(13.3.1.6)并通过重载决策(13.3)选择最佳转换函数来选择此转换),
然后,引用绑定到第一种情况下的初始化表达式lvalue和第二种情况下转换的左值结果(或者,在任何一种情况下,绑定到对象的相应基类子对象).[注意:不需要通常的左值到右值(4.1),数组到指针(4.2)和函数到指针(4.3)标准转换,因此当对左值的这种直接绑定是完成. - 尾注]
鉴于此片段
class Base
{
public:
Base(){};
};
class Derived : public Base
{
public:
Derived();
};
Derived::Derived() :Base() {}
Run Code Online (Sandbox Code Playgroud)
并考虑§12.6.2/ 2中的这一陈述(我的重点)
在mem-initializer-id中,在构造函数的类的范围内查找初始的非限定标识符,如果在该范围内找不到,则在包含构造函数定义的范围中查找它.
我想你说的名称查找Base在定义Derived构造函数是在发现的Derived类定义.
我只是想知道,如果还有其他更有形的例子,除了12.6.2/3中给出的例子,其中在构造函数的类中找不到mem-initializer-id.
错误:
main.cpp: In function 'constexpr int fib(int)':
main.cpp:6:42: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
return (n < sizeof(ftbl)/sizeof(*ftbl)) ? ftbl[n] : fib(n-2) + fib(n-1);
^
/tmp/cch0aLwI.o: In function `main':
main.cpp:(.text.startup+0xf): undefined reference to `std::cout'
main.cpp:(.text.startup+0x16): undefined reference to `std::ostream::operator<<(int)'
main.cpp:(.text.startup+0x2d): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)'
main.cpp:(.text.startup+0x3c): undefined reference to `std::cout'
main.cpp:(.text.startup+0x43): undefined reference to `std::ostream::operator<<(int)'
main.cpp:(.text.startup+0x5a): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char …Run Code Online (Sandbox Code Playgroud) 第7.2节枚举声明没有说明有关范围枚举的内容operator!=()和内容operator==().但是下面的代码编译.
#include <iostream>
enum class Month{jan = 1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov , dec};
int main()
{
Month a = Month::feb;
Month b = Month::jul;
Month c = a;
if( a != b ) std::cout << "a |= b" << '\n';
if( a == c ) std::cout << "a == c" << '\n';
}
Run Code Online (Sandbox Code Playgroud) 在C++标准中,它是否说在命名空间范围之外定义命名空间的变量成员的方法是通过extern在变量成员的声明中使用说明符?
§3.4.1/ 14提到这个"en passant":
如果命名空间的变量成员在其命名空间的范围之外定义,则会查找成员定义中出现的任何名称(在declarator-id之后),就好像成员的定义出现在其名称空间中一样.[例如:
namespace N {
int i = 4;
extern int j;
}
int i = 2;
int N::j = i; // N::j == 4
Run Code Online (Sandbox Code Playgroud)