以下C++ 11程序是否格式错误?
struct a
{
struct b { };
void f() {};
};
extern struct a b;
struct a ::b;
int main()
{
b.f();
}
Run Code Online (Sandbox Code Playgroud)
为什么/为什么不呢?
这里感兴趣的是这一行:
struct a ::b;
Run Code Online (Sandbox Code Playgroud)
这是内部阶级的前瞻性声明a::b吗?
或者这是全局变量的定义b?相当于:
struct a (::b);
Run Code Online (Sandbox Code Playgroud) 以下C++ 11翻译单元是否格式良好?
typedef int T;
::T i;
Run Code Online (Sandbox Code Playgroud)
如果是这样,它似乎与标准语法不匹配.
本simple-type-specifier应匹配::T,但语法是:
simple-type-specifier:
nested-name-specifier_opt type-name
Run Code Online (Sandbox Code Playgroud)
和一个nested-name-specifier不能::单独匹配,所以simple-type-specifier无法比拟::T.
这是标准缺陷吗?
在C++ 11中,类型说明符包括类说明符和枚举说明符.(又名类定义和枚举定义)
根据语法/语法 - 类型说明符可以出现在语言的几个地方,但不是所有那些地方都允许使用类说明符和枚举说明符.
例如:
struct C{} c;
// ok: types may be defined in the specifiers of a simple declaration
void f(struct S{});
// error: types may not be defined in parameter types
constexpr auto i = sizeof(enum E{});
// error: types may not be defined in ‘sizeof’ expressions
Run Code Online (Sandbox Code Playgroud)
标准中的哪些部分将类型说明符的这些用法划分为可以定义类型和不定义类型的那些?例如,在sizeof表达式中可能没有定义类型的规则在哪里?
在C++ 14中:
对于任何整数或枚举类型T以及任何表达式expr:
之间有什么区别:
struct S { T t { expr }; };
Run Code Online (Sandbox Code Playgroud)
和
struct S { T t = { expr }; };
Run Code Online (Sandbox Code Playgroud)
更新:
我得到了[dcl.init.list]p3b5:
如果初始化列表具有E类型的单个元素且T不是引用类型或其引用类型与E引用相关,则从该元素初始化对象或引用.
我相信这个引用适用于直接列表初始化和复制列表初始化.
所以我认为答案是否定的,没有区别.
我有一个班级X:
class X { ... }
Run Code Online (Sandbox Code Playgroud)
我想做这个:
void f()
{
thread_local static X x = ...;
...
}
Run Code Online (Sandbox Code Playgroud)
(实际上我正在使用gcc所以关键字是"__thread")
但我不能,因为你只能有琐碎的thread_locals.
最好的解决办法是什么?
如果我这样做:
void f()
{
thread_local static X* p = 0;
if (!p)
p = new X(...);
X& x = *p;
...
}
Run Code Online (Sandbox Code Playgroud)
然后:
更新:
这是我到目前为止:
#include <iostream>
#include <type_traits>
using namespace std;
class X { public: X() { cout << "X::X()" << endl; }; ~X() { cout << "X::~X()" << endl; } };
void f()
{
static …Run Code Online (Sandbox Code Playgroud) 可能重复:
有没有办法从C++中区分文件?
我有很长的文本字符串,我希望差异和补丁.给出字符串a和b:
string a = ...;
string b = ...;
string a_diff_b = create_patch(a,b);
string a2 = apply_patch(a_diff_b, b);
assert(a == a2);
Run Code Online (Sandbox Code Playgroud)
如果a_diff_b是人类可读的,那将是一个奖励.
实现这一点的一种方法是使用system(3)从中调用diff和patchshell命令diffutils并将它们管道化.另一种方法是自己实现这些功能(我正在考虑原子地处理每一行并使用标准编辑距离n ^ 3算法沿行回溯).
我想知道是否有人知道一个好的Linux C或C++库可以在进程中完成这项工作吗?
N3337是C++标准的工作草案,发布于2012-01-16:
它只对官方C++ 11标准进行了少量的编辑性修改.
N3337在2012-02-28被修改为N3376:
N3376在2012-11-02被修改为N3485:
我有兴趣知道N3337和N3485之间的区别吗?(或等效地说明N3337和N3376之间的差异以及N3376和N3485之间的差异)
一种方法是尝试分析以下的git日志:
另一种方法是将PDF转储到文本并diff在其上运行.
是否有更好的方法来跟踪这些变化?在某处保留了一系列精选的变更清单吗?也许在标准位置或标准格式?
许多linux/x86-64系统调用接受指向结构的指针作为参数.
例如,第二个参数stat(2)是struct stat*......
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for file system I/O */ …Run Code Online (Sandbox Code Playgroud) 假设我有一个X类:
struct X
{
...
};
Run Code Online (Sandbox Code Playgroud)
我有一个全局向量V:
vector<X*> V;
Run Code Online (Sandbox Code Playgroud)
我想将V的新实例添加到V中,当且仅当它是动态分配的时(作为完整的大多数派生对象,而不是子对象):
int main()
{
X x; // not added to V
new X; // added to V
struct D : X {};
new D; // not added to V
}
Run Code Online (Sandbox Code Playgroud)
有办法做到这一点吗?也许是以operator new某种方式超载/覆盖?
假设我想编写一个执行整数平方根的C++ 1y/14 constexpr函数:
constexpr int constexpr_isqrt(int x);
Run Code Online (Sandbox Code Playgroud)
我想进行一次完整性检查以确保它x是非负面的:
constexpr int constexpr_isqrt(int x)
{
if (x < 0)
???
...
}
Run Code Online (Sandbox Code Playgroud)
我应该在???上面写什么?
理想情况下,如果在常量上下文中计算函数,它应该导致编译时错误,并且如果在运行时调用运行时错误(例如中止或抛出异常).