有人告诉我:
在x86-64下,FP算法使用SSE完成,因此long double是64位.
但是在x86-64 ABI中它说:
C type | sizeof | alignment | AMD64 Architecture
long double | 16 | 16 | 80-bit extended (IEEE-754)
Run Code Online (Sandbox Code Playgroud)
和gcc说sizeof(long double)是16并给出FLT_DBL= 1.79769e+308和FLT_LDBL = 1.18973e+4932
所以我很困惑,long double64位是怎么回事?我认为这是一个80位的表示.
假设我有一个类型层次结构:
struct B { ... };
struct D1 : B { ... };
struct D2 : B { ... };
...
struct Dn : B { ... };
Run Code Online (Sandbox Code Playgroud)
每个Di都有自己的operator==定义:
struct Di : B
{
bool operator==(const Di&) const { ... }
...
};
Run Code Online (Sandbox Code Playgroud)
我现在想要定义B,operator==这样:
struct B
{
bool operator==(const B& that) const
{
// psuedo-code
let i, such the dynamic type of this is Di
let j, such the dynamic type of that is Dj
if …Run Code Online (Sandbox Code Playgroud) 考虑以下C++ 11代码:
struct C {};
void f(int(C));
Run Code Online (Sandbox Code Playgroud)
类型是否f相同:
typedef int T(C);
void f(T);
Run Code Online (Sandbox Code Playgroud)
或者是这样的:
void f(int C);
Run Code Online (Sandbox Code Playgroud)
也就是说,应该将(C)其解释为declarator参数名称的一个C,还是作为abstract-declarator函数参数的一个?
标准中指定的是哪里?
C++标准库中的哪些模板(如果有)具有一个或多个模板模板参数?
如果有很多,那么几个例子就可以了.
如果C++版本很重要,那么最新的C++ 14/C++ 1y草案就会得到优先考虑.
libstdc ++,作为一个例子,使用红色黑色二叉树实现std :: map,其中节点中有父指针.这意味着迭代器只能是指向节点的指针.
标准库是否可以实现std :: map而不在节点中存储父指针?我认为这意味着迭代器需要包含一堆父指针,因此需要动态分配一个对数量的内存.这会违反迭代器的标准性能限制吗?不会让父指针违反接口其余部分的任何其他性能约束吗?
那么C++ 17中的新节点东西/接口怎么样?
我想给几个不同的人提交访问权限,每个人都可以访问我自己的Linux服务器上独立的git存储库.
一种方法是:
foreach user x
adduser x
create /home/x/repo.git
ask user x to clone from ssh://myserver.com/home/x/repo.git
Run Code Online (Sandbox Code Playgroud)
然而,这会产生不良影响,他们也可以通过ssh登录.我不想给他们shell访问权限.
反正有没有以类似的方式设置它,但纯粹给他们git提交访问而不是shell访问?
以下代码:
struct X
{
void f() {}
void g()
{
auto h = &f;
}
};
Run Code Online (Sandbox Code Playgroud)
结果是:
error: ISO C++ forbids taking the address of an unqualified
or parenthesized non-static member function to form a pointer
to member function. Say ‘&X::f’
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么标准不允许和禁止这样做?作为用户,将它称为不合格会更方便,所以我假设有一些其他的理由(安全性?模糊性?编译器实现的简易性?)?
在C++ 11(N3485)10.1.4 [class.mi]中它说:
对于最派生类的类点阵中非虚拟基类的每个不同出现,最派生的对象应包含该类型的对应的不同基类子对象.
对于指定为virtual的每个不同的基类,最派生的类应包含该类型的单个基类对象.
考虑以下C++ 11代码:
struct B {};
struct BV : virtual B {};
struct BN : B {};
struct C1 : BV, BN {};
struct C2 : BV, BN {};
struct D : C1, C2 {};
Run Code Online (Sandbox Code Playgroud)
首先,为清楚起见,D的类格子有多少个顶点?
其次,B类有多少个不同的子对象,标准要求D类型的派生对象有多少?
更新:
以下哪一类是格子?
(1)
B B B B
^ ^ ^ ^
| | | |
BV BN BV BN
^ ^ ^ ^
| | | |
\ / \ / …Run Code Online (Sandbox Code Playgroud) 无论如何要区分类型的原始名称和该类型的typedef-name?
例如:
class C1 {};
typedef C1 C2;
Run Code Online (Sandbox Code Playgroud)
C1和C2现在都命名相同的类型.在上述代码之后的代码中,是否有一种情况是,参考所讨论的类型的名称C1的出现不能用C2替换(反之亦然)?
与std :: vector不同,std :: string不提供采用大小的一元构造函数:
std::string s(size); // ERROR
Run Code Online (Sandbox Code Playgroud)
之间有什么区别:
std::string s(size, '\0');
Run Code Online (Sandbox Code Playgroud)
和
std::string s;
s.resize(size);
Run Code Online (Sandbox Code Playgroud)
在共同实施方面的表现?
调整大小会将字符串初始化为所有零字符还是会给它们留下未指定的值?
如果全部为零,是否有任何方法可以构造给定大小的字符串,但是将字符保留为未指定的值?