在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在下面指出的那样,如何解决内联命名空间的重载问题,它们是否会发生冲突?
当读取关于forward_list在C++ 11的FCD和N2543我绊倒的一个特定的过载splice_after(略微简化的,并让cit是const_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++ TCP服务器程序,使用pthreads,bind,listen和accept.我有一个场景,当我杀死一个连接的客户端时服务器结束(读取:崩溃).
崩溃的原因是write()对文件的调用失败,因此程序收到一个SIGPIPE.我想,这会让服务器退出.
我想,"当然,未处理的信号意味着退出",所以让我们使用signal():
signal(SIGPIPE, SIG_IGN);
Run Code Online (Sandbox Code Playgroud)
因为,取自man 2 write:
EPIPE fd 连接到读取端关闭的管道或插座.当发生这种情况时,写入过程也将收到SIGPIPE信号.(因此,仅当程序捕获,阻止或忽略此信号时才会看到写入返回值.)
唉,没有.无论是在服务器线程还是客户端线程中,这似乎都没有帮助.
那么,如何阻止write()呼叫发出该信号,或者(务实)如何阻止服务器退出.
我的诊断是:
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) 在他的Blog Herb Sutter写道
[...]因为增加智能指针引用计数 通常可以优化为与优化
shared_ptr实现中的普通增量相同- 在生成的代码中只是普通的增量指令,而不是围栏.然而,减量必须是原子减量或等效物,它产生特殊的处理器存储器指令,这些指令本身更昂贵,并且最重要的是在优化周围代码时引起存储器栅栏限制.
该文是关于执行的shared_ptr,我不确定他的评论是否只适用于此或通常是这样.从他的表述我收集它一般.
但是当我想到它时,我只能想到"更加昂贵的减量",当if(counter==0)紧接着 - 这可能就是这种情况shared_ptr.
因此,我想知道原子操作++counter是否(通常)总是快于--counter,或者只是因为它if(--counter==0)...与shared_ptr?一起使用?
当我将代码从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?是否允许编译器删除按值捕获所需的副本?
vector<Image> movie1;
apply( [=movie1](){ return movie1.size(); } );
Run Code Online (Sandbox Code Playgroud)
movie1?
apply实际上并没有改变 movie1?const仿函数吗?vector有一个移动构造函数和移动分配?
Image,以防止昂贵的副本?void operate(vector<Image> movie)在经历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++ 11中新的ranged-for将非常简洁和有用.据我了解它是如何工作的,它会查找"容器" begin并end尝试*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) 在阅读关于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 …
我揣摩如何在新system_error一起error_code,error_category而不是(是为了执行最低便携式错误报告)error_condition应该被使用.
我想通过阅读boost.system我明白我应该如何使用error_codes和error_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_category或error_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)