我试图理解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类型的第一个参数传递给分配函数.该参数不得小于正在创建的对象的大小; 仅当对象是数组时,它可能大于正在创建的对象的大小.
我可能会遗漏一些东西,但在我看来,我们在这两个陈述中都存在矛盾.据我所知,所需的额外空间仅用于数组对象,并且这个额外的空间将保存数组中的元素数,而不是数组的大小(以字节为单位).
我只是想知道为什么tellg()在basic_istream<>类中tellp()定义并在basic_ostream<>类中定义的成员函数具有不同的名称.这是因为basic_fstream<>是源于basic_istream<>和basic_ostream<>吗?
作者在标题下提出了这段代码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没有报告运行时错误.
[conv]/6(重点是我的):
任何隐式转换的效果都与执行相应的声明和初始化,然后使用临时变量作为转换的结果相同。如果 T 是左值引用类型或函数类型 ([dcl.ref]) 的右值引用,则结果为左值,如果 T 是对象类型的右值引用,则结果为 xvalue,否则为 prvalue。表达式 e 用作泛左值当且仅当初始化将其用作泛左值。
在此特定段落的上下文中,上面突出显示的声明的含义是什么?
我刚刚开始阅读S. Chacon和B. Straub的书"Pro Git".在第2章,在记录对存储库的更改部分中,您将找到以下声明:
请记住,工作目录中的每个文件都可以处于以下两种状态之一:已跟踪或未跟踪.跟踪文件是最后一个快照中的文件; 它们可以不被修改,修改或分阶段.
由此,我得到的印象是跟踪文件集可能比分阶段文件集大.但在我看这个链接的同时,我可以看到下面的陈述似乎与书中所写的内容相矛盾:
要告诉Git开始跟踪对octocat.txt所做的更改,我们首先需要使用git add将它添加到暂存区域.
这似乎表示每个分阶段文件都是跟踪文件,反之亦然.
我错过了什么?
这段代码在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) 我之所以这么问是因为 N4582 中的第 9.5.1 节 [class.union.anon](似乎是最新草案)对应于上面链接中的第9.3.1节。我一直认为这两个版本的标准应该是一致的,或者这只是一个编辑错误。
下面注释掉的表达式无法编译,因为它位于全局范围内.但是在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) 说明
constexpr符仅应用于变量或变量模板的定义或者函数或函数模板的声明。说明consteval符仅适用于函数或函数模板的声明。constexpr使用or说明符声明的函数或静态数据成员consteval隐式是内联函数或变量 ([dcl.inline])。如果函数或函数模板的任何声明具有constexpr或consteval说明符,则其所有声明都应包含相同的说明符。Run Code Online (Sandbox Code Playgroud)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 …