小编Mar*_*zog的帖子

使用const ref参数进行自我赋值的行为

我偶然发现了一些非常古老的代码,它有一个带有定义的复制赋值运算符的类,它将其参数作为const引用,但也不检查自赋值,所以基本上:

struct A
{
    int q;
    A(): q(3) {}

    A& operator=(const A& a)
    {
        q = a.q;
        return *this;
    }
};
Run Code Online (Sandbox Code Playgroud)

当一个实例A被赋给自己时,这个赋值运算符的行为是什么?我认为这会导致问题,因为它"破坏"参数的常量,任何编译器都可以假设参数没有改变并基于此进行优化.

然而,clang和gcc都没有发出警告,程序运行正常.如果我q在赋值运算符中赋值之前显式将值更改为4,这也可以工作.

c++ c++98

8
推荐指数
1
解决办法
620
查看次数

io_service::run() async_* 函数的处理顺序

假设在调用 io_service::run() 时,调度了多个 async_read 操作(它们之间可能还有其他操作)。当在 ReadHandler 函数中安排像 async_write 这样的异步操作时会发生什么?

void handler(const boost::system::error_code& error, std::size_t bytes) {
    async_write(sock, boost::asio::buffer(wbuf), whandler);
}
Run Code Online (Sandbox Code Playgroud)

也就是说,什么时候会调用async_write?我希望执行顺序是:

1) async_read //1
2) async_write
3) async_read //2
4) async_write
Run Code Online (Sandbox Code Playgroud)

这个执行顺序有保证吗?

c++ boost boost-asio

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

initializer_list与其他参数结合使用

假设我有一个类,它接受类型T的参数和U构造函数中类型的参数集合.以下解决方案有效:

struct Q
{
    Q(T t, std::initializer_list<U> us);
};
Run Code Online (Sandbox Code Playgroud)

然后创建此类的实例将是:

Q q {t1, {u1, u2, u3, u4} };

但这对我来说看起来有点不洁净.有没有比这个更好的解决方案?

c++ initialization c++11

4
推荐指数
1
解决办法
410
查看次数

标签 统计

c++ ×3

boost ×1

boost-asio ×1

c++11 ×1

c++98 ×1

initialization ×1