小编tow*_*owi的帖子

std :: literals :: ..作为内联命名空间有什么好处?

在C++ - Standard(例如N4594)中,有两种定义operator""s:

namespace std {
...
inline namespace literals {
inline namespace chrono_literals {
// 20.15.5.8, suffixes for duration literals
constexpr chrono::seconds operator"" (unsiged long long);
Run Code Online (Sandbox Code Playgroud)

string课程:

namespace std { 
....
inline namespace literals {
inline namespace string_literals {
// 21.3.5, suffix for basic_string literals:
string operator "" s(const char* str, size_t len);
Run Code Online (Sandbox Code Playgroud)

我想知道从这些命名空间(以及其他所有命名空间std::literals)中获得了什么,如果它们是inline.

我认为它们位于不同的命名空间内,因此它们不会相互冲突.但是当它们存在时inline,这种动机就会消失,对吧?编辑:因为Bjarne解释主要动机是"库版本化",但这不适合这里.

我可以看到"Seconds"和"String"的重载是不同的,因此不会发生冲突.但如果重载相同,它们会发生冲突吗?或者采取(inline?)namespace以某种方式阻止?

因此,他们从中获得了什么inline namespace呢?正如@Columbo在下面指出的那样,如何解决内联命名空间的重载问题,它们是否会发生冲突?

c++ namespaces literals inline-namespaces c++14

21
推荐指数
1
解决办法
2405
查看次数

没有O(1)操作来连接两个forward_lists中的元素?

当读取关于forward_list在C++ 11的FCD和N2543我绊倒的一个特定的过载splice_after(略微简化的,并让citconst_iterator):

void splice_after(cit pos, forward_list<T>& x, cit first, cit last);
Run Code Online (Sandbox Code Playgroud)

行为是在移动pos之间的所有内容之后.从而:(first,last)this

  this: 1 2 3 4 5 6           x: 11 12 13 14 15 16
          ^pos                      ^first   ^last
will become:
  this: 1 2 13 14 3 4 5 6     x: 11 12       15 16
          ^pos                      ^first   ^last
Run Code Online (Sandbox Code Playgroud)

描述包括复杂性:

复杂度:O(距离(第一,最后))

我可以看到这是因为需要调整PREDECESSOR(last).next = pos.next,并且forward_list不允许在O(1)中发生这种情况.

好的,但是没有加入O(1)这个简单数据结构的优势之一的两个单链表?因此我想知道 - forward_list接头/合并/连接O(1)中的任意数量的元素时是否没有操作?

当然,算法非常简单.只需要一个操作名称(伪代码):( 通过集成Kerreks答案 …

c++ complexity-theory c++11

19
推荐指数
2
解决办法
444
查看次数

如何防止SIGPIPE或阻止服务器结束?

一个非常标准的C++ TCP服务器程序,使用pthreads,bind,listenaccept.我有一个场景,当我杀死一个连接的客户端时服务器结束(读取:崩溃).

崩溃的原因是write()文件的调用失败,因此程序收到一个SIGPIPE.我想,这会让服务器退出.

我想,"当然,未处理的信号意味着退出",所以让我们使用signal():

signal(SIGPIPE, SIG_IGN);
Run Code Online (Sandbox Code Playgroud)

因为,取自man 2 write:

EPIPE fd 连接到读取端关闭的管道或插座.当发生这种情况时,写入过程也将收到SIGPIPE信号.(因此,仅当程序捕获,阻止或忽略此信号时才会看到写入返回值.)

唉,没有.无论是在服务器线程还是客户端线程中,这似乎都没有帮助.

那么,如何阻止write()呼叫发出该信号,或者(务实)如何阻止服务器退出.


我的诊断是:

  • 服务器线程启动,绑定,监听,接受.
  • 让客户端连接(例如通过telnet)
  • 发送一个pkill telnet崩溃客户端

不需要的行为:服务器退出,在gdb

... in write () at ../sysdeps/unix/syscall-template.S:82
82      T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
Run Code Online (Sandbox Code Playgroud)

回溯:

#0  ... in write () at ../sysdeps/unix/syscall-template.S:82
#1  ... in ClientHandler::mesg(std::string) ()
#2  ... in ClientHandler::handle() ()
#3  ... in …
Run Code Online (Sandbox Code Playgroud)

c c++ sockets signals client-server

18
推荐指数
3
解决办法
1万
查看次数

原子衰减比增量更贵吗?

在他的Blog Herb Sutter写道

[...]因为增加智能指针引用计数 通常可以优化为与优化shared_ptr实现中的普通增量相同- 在生成的代码中只是普通的增量指令,而不是围栏.

然而,减量必须是原子减量或等效物,它产生特殊的处理器存储器指令,这些指令本身更昂贵,并且最重要的是在优化周围代码时引起存储器栅栏限制.

该文是关于执行的shared_ptr,我不确定他的评论是否只适用于此或通常是这样.从他的表述我收集它一般.

但是当我想到它时,我只能想到"更加昂贵的减量",当if(counter==0)紧接着 - 这可能就是这种情况shared_ptr.

因此,我想知道原子操作++counter是否(通常)总是快--counter,或者只是因为if(--counter==0)...shared_ptr?一起使用?

c++ performance atomic reference-counting memory-fences

18
推荐指数
3
解决办法
907
查看次数

C++ - 相当于C中未完全初始化的数组?

当我将代码从C转换为C++时,我有时会遇到C语言构造,但与C++兼容.通常我想以最少侵入的方式转换代码.但我有一个案例,我发现这很困难:

在C语言中你可以声明一个数组并使用"指示符" 初始化 ...... well ... 部分,其余部分归零(编辑:我在这里写了"留给随机性",第一个):

int data[7] = {
    [2] = 7,
    [4] = 9,
};
Run Code Online (Sandbox Code Playgroud)

这不是有效的C++代码(幸运的是).所以我将不得不使用不同的策略.

虽然我可以在C++ 11中看到一种非侵入性的方式:

static const map<int,int> data = { {2,7}, {4,9} };
Run Code Online (Sandbox Code Playgroud)

当C++ 11功能尚不可用时,我该怎么办?

  • 我可以规避运行时初始化吗?
  • 有没有办法以"文字"方式初始化类似的映射?
  • 什么是最少侵扰使用的代码data

c c++

15
推荐指数
2
解决办法
442
查看次数

C++ 0x:为Lambda捕获值,总是一个副本?

是否允许编译器删除按值捕获所需的副本

vector<Image> movie1;
apply( [=movie1](){ return movie1.size(); } );
Run Code Online (Sandbox Code Playgroud)
  • 有没有编译器不需要复制的情况movie1
    • 也许如果编译器可以知道,那apply实际上并没有改变 movie1
    • 或者,在任何情况下,Lambdas都是默认的const仿函数吗?
  • 它是否有助于在所有vector有一个移动构造函数移动分配
    • 如果是,是否还需要添加这些Image,以防止昂贵的副本?
  • 按值参数相比,值捕获需要副本的时间和方式是否存在差异?例如.?void operate(vector<Image> movie)

c++ lambda copy-constructor c++11

14
推荐指数
1
解决办法
1114
查看次数

"noexcept"vs"投掷:什么都没有"

在经历C++ 0x工作草案的最后编辑时,我发现了很多

  • 删除关键字 noexcept
  • 添加文本投掷:没有在同一个地方

反之亦然.只是一些例子:

  • 更换noexcept反对投掷:无:20.6.4指针安全[util.dynamic.safety] template<class T> T*undeclare_reachable(T*p);
  • 增加noexcept:20.6.3.2.指针特征成员函数[pointer.traits.functions]:static pointer pointer_trait<T*>::pointer_to(...) noexcept;

问题在这里:

  • 是否有一个一般的规则/模式,我们会发现noexcept抛出:没有在STD-库?
  • 用户是否应该根据给定规则获得特定行为?即他们应该或不应该添加noexcept自己的功能?

c++ exception noexcept c++11

14
推荐指数
1
解决办法
2019
查看次数

我什么时候应该使用新的ranged-for,我可以将它与新的cbegin/cend结合使用吗?

当然,C++ 11中新的ranged-for将非常简洁和有用.据我了解它是如何工作的,它会查找"容器" beginend尝试*Argument-dependent-Lookup"(ADT).

但另一个补充是,所有容器现在都拥有cbegin()cend()获得const_iterators容器.

我有点困惑,一方面是我想我应该用cbegin()我如果不是,要修改的容器,另一方面我必须添加额外的const内部范围,为获得同样的事情.

所以,它看起来像这样:

// print all
for(const auto elem : data)
  cout << elem
Run Code Online (Sandbox Code Playgroud)

使用ADT,找到data.begin(),因此const需要.

VS

// print everything but the first (a reason not to use range-for)
for(auto it = data.cbegin()+1; it!=data.cend(); ++it)
  cout << *it
Run Code Online (Sandbox Code Playgroud)

使用data.cbegin(),因此const不需要.

但这不是更"惯用"吗?:

// print everything but the first (a reason not to use range-for) …
Run Code Online (Sandbox Code Playgroud)

c++ foreach for-loop idioms c++11

14
推荐指数
1
解决办法
3316
查看次数

由于定义顺序,"令人惊讶"的常量初始化

在阅读关于constexpr幻灯片时,介绍是关于"令人惊讶的动态初始化与consts".这个例子是

struct S {
    static const int c;
};
const int d = 10 * S::c;
const int S::c = 5;
Run Code Online (Sandbox Code Playgroud)

唉,音轨缺失了,音符也是如此,所以我只能猜到这里的含义.

是否正确d地"动态地"初始化,因为之前S::c定义了吗? d声明S::c是之前d可能是不够的,编译器需要完整的定义,对不对?

那就是说,我怀疑,在下面的例子中d 静态初始化?

struct S {
    static const int c;
};
const int S::c = 5;
const int d = 10 * S::c;  // now _after_ defn of S::c
Run Code Online (Sandbox Code Playgroud)

并采取蛋糕,在C++ 11,什么必须是constexpr完全静态初始化?S::c …

c++ initialization const constexpr c++11

13
推荐指数
1
解决办法
984
查看次数

实现一个好的C++ 0x error_condition?

我揣摩如何在新system_error一起error_code,error_category而不是(是为了执行最低便携式错误报告)error_condition应该被使用.

我想通过阅读boost.system我明白我应该如何使用error_codeserror_category.该描述省略了在使用system_error`抛出异常时如何结合使用,但是从我可以猜到的那个类的接口.

class system_error : public runtime_error {
public:
  // [...]
  system_error(error_code ec, const string& what_arg);
  system_error(int ev, const error_category& ecat, const string& what_arg);
  system_error(int ev, const error_category& ecat);
  // [...]
Run Code Online (Sandbox Code Playgroud)

所以,我抛出一个system_error-exception与右int+ error_categoryerror_code与它的error_category()-方法.

但是提供便携式接口的方式是什么error_condition

双方error_code error_category都有方法default_error_condition:

class error_category {
public:
  // [...]
  virtual error_condition default_error_condition(int ev) …
Run Code Online (Sandbox Code Playgroud)

error-handling boost exception boost-asio c++11

12
推荐指数
1
解决办法
1179
查看次数