将原子传递给可变参数时,为什么要调用复制构造函数?

问题描述

我正在尝试将std::atomic<unsigned int>传递给带有可变参数的函数,例如:

#include <cstdio>
#include <cstdarg>
#include <atomic>

void info(const char* expression,...)
{
    std::va_list arg;
    va_start(arg,expression);

    std::vprintf(expression,arg);
    std::printf("\n");
    std::fflush(stdout);

    va_end(arg);
}

int main()
{
    std::atomic<unsigned int> value(10);
    info("Testing: %u",value);

    return 0;
}

按原样,我得到编译器错误error: use of deleted function ‘std::atomic::atomic(const std::atomic&)’。但是,如果我将main中的信息调用更改为info("Testing: %u",value.load());,则一切正常。

为什么我未指定负载调用复制构造函数

解决方法

在3种情况下调用复制构造函数:

  1. 按值传递对象时
  2. 按值返回对象时
  3. 将对象初始化为相同类型的对象的值时。

如果不想调用复制构造函数,请通过引用(最好是常量)传递对象,以避免调用复制构造函数。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...