我偶然发现了一些非常古老的代码,它有一个带有定义的复制赋值运算符的类,它将其参数作为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,这也可以工作.
假设在调用 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)
这个执行顺序有保证吗?
假设我有一个类,它接受类型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} };
但这对我来说看起来有点不洁净.有没有比这个更好的解决方案?