小编Joh*_*ane的帖子

Stroustrup书和C++标准之间的明显矛盾

我试图理解Stroustrup的"The C++ Programming Language"(第282页)中的以下段落(重点是我的):

要解除分配new,delete和delete []分配的空间,必须能够确定分配的对象的大小.这意味着使用new的标准实现分配的对象将占用比静态对象稍多的空间.至少需要空间来保持物体的大小.通常每个分配有两个或更多个单词用于免费商店管理.大多数现代机器使用8字节字.当我们分配许多对象或大对象时,这种开销并不重要,但是如果我们在免费商店中分配大量小对象(例如,int或Points)则可能很重要.

请注意,作者没有在上面突出显示的句子中区分对象是否是数组.

但是根据C++ 14中的段落§5.3.4/ 11,我们(我的重点):

当new-expression调用分配函数并且尚未扩展分配时,new-expression将请求的空间量作为std :: size_t类型的第一个参数传递给分配函数.该参数不得小于正在创建的对象的大小; 当对象是数组时,它可能大于正在创建的对象的大小.

我可能会遗漏一些东西,但在我看来,我们在这两个陈述中都存在矛盾.据我所知,所需的额外空间仅用于数组对象,并且这个额外的空间将保存数组中的元素数,而不是数组的大小(以字节为单位).

c++ memory-management c++14

21
推荐指数
2
解决办法
1872
查看次数

basic_istream <> :: tellg()和basic_ostream <> :: tellp()之间的区别

我只是想知道为什么tellg()basic_istream<>类中tellp()定义并在basic_ostream<>类中定义的成员函数具有不同的名称.这是因为basic_fstream<>是源于basic_istream<>basic_ostream<>吗?

c++ filestream

11
推荐指数
2
解决办法
5026
查看次数

如果使用cout.rdbuf()来切换缓冲区并且从不将其设置回来,会出现什么问题?

作者在标题下提出了这段代码A bus error on my platform

#include <fstream>
#include <iostream>

int main()
{
    std::ofstream log("oops.log");
    std::cout.rdbuf(log.rdbuf());
    std::cout << "Oops!\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

字符串"Oops!\n"将打印到文件"oops.log".代码不会恢复cout的streambuf,但VS2010没有报告运行时错误.

c++ fstream streambuf undefined-behavior

6
推荐指数
2
解决办法
962
查看次数

[conv]/6 中“表达式 e 用作泛左值当且仅当初始化将其用作泛左值”语句的确切含义是什么

[conv]/6(重点是我的):

任何隐式转换的效果都与执行相应的声明和初始化,然后使用临时变量作为转换的结果相同。如果 T 是左值引用类型或函数类型 ([dcl.ref]) 的右值引用,则结果为左值,如果 T 是对象类型的右值引用,则结果为 xvalue,否则为 prvalue。表达式 e 用作泛左值当且仅当初始化将其用作泛左值

在此特定段落的上下文中,上面突出显示的声明的含义是什么?

c++ language-lawyer c++14 c++17

5
推荐指数
1
解决办法
145
查看次数

跟踪文件和分阶段文件之间有什么区别?

我刚刚开始阅读S. Chacon和B. Straub的书"Pro Git".在第2章,在记录对存储库的更改部分中,您将找到以下声明:

请记住,工作目录中的每个文件都可以处于以下两种状态之一:已跟踪或未跟踪.跟踪文件是最后一个快照中的文件; 它们可以不被修改,修改或分阶段.

由此,我得到的印象是跟踪文件集可能比分阶段文件集大.但在我看这个链接的同时,我可以看到下面的陈述似乎与书中所写的内容相矛盾:

要告诉Git开始跟踪对octocat.txt所做的更改,我们首先需要使用git add将它添加到暂存区域.

这似乎表示每个分阶段文件都是跟踪文件,反之亦然.

我错过了什么?

git

4
推荐指数
2
解决办法
1358
查看次数

为什么VS2010中的"ambigous symbol"错误代码如下?

这段代码在VS2010中编译,我相信它适用于任何编译器.

#include <iosfwd>
using namespace std;
class ostream;
int main() {}
Run Code Online (Sandbox Code Playgroud)

这段代码也是如此

#include <iosfwd>
using namespace std;
int main() { class ostream; }
Run Code Online (Sandbox Code Playgroud)

但是此代码生成错误C2872:'ostream':模糊符号

#include <iosfwd>
using namespace std;
class ostream;
int main() { class ostream; }
Run Code Online (Sandbox Code Playgroud)

c++ stream forward-declaration

2
推荐指数
1
解决办法
1005
查看次数

我想知道以下链接对应的 C++ 标准草案编号是什么

http://eel.is/c++draft/

我之所以这么问是因为 N4582 中的第 9.5.1 节 [class.union.anon](似乎是最新草案)对应于上面链接中的第9.3.1节。我一直认为这两个版本的标准应该是一致的,或者这只是一个编辑错误。

c++ language-lawyer c++17

2
推荐指数
1
解决办法
149
查看次数

在c ++中,仅在全局范围内允许`expressions`来初始化全局对象.我在哪里可以找到标准中的这个?

下面注释掉的表达式无法编译,因为它位于全局范围内.但是在C++标准中我找到了与此限制相关的内容吗?我记得,只有全局范围内的表达式才能初始化全局对象.我已经查看了第5章表达式,但没有用.

#include <iostream>
//std::cout.setf(std::ios_base::hex, std::ios_base::basefield);


int main()
{
    std::cout.setf(std::ios_base::hex, std::ios_base::basefield);
} 
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer

2
推荐指数
1
解决办法
105
查看次数

C++20 标准 (N4860) 中哪里规定内联函数必须在翻译单元中使用之前定义?

[dcl.constexpr]/1 :

说明constexpr符仅应用于变量或变量模板的定义或者函数或函数模板的声明。说明consteval符仅适用于函数或函数模板的声明。constexpr使用or说明符声明的函数或静态数据成员consteval隐式是内联函数或变量 ([dcl.inline])。如果函数或函数模板的任何声明具有constexprconsteval说明符,则其所有声明都应包含相同的说明符。

实施例1

constexpr void square(int &x);  // OK, declaration
constexpr int bufsz = 1024;     // OK, definition
constexpr struct pixel {        // error: pixel is a type
  int x;
  int y;
  constexpr pixel(int);         // OK, declaration
};
constexpr pixel::pixel(int a)
  : x(a), y(x)                  // OK, definition
  { square(x); }
constexpr pixel small(2);       // error: square not defined, so small(2) <<<<<<<<<<<<<<<<<<<<
                                // not constant ([expr.const]) so …
Run Code Online (Sandbox Code Playgroud)

c++ inline c++20 constexpr-function

0
推荐指数
1
解决办法
121
查看次数