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

Why is a copy constructor being called when passing an atomic into a variadic argument?

我正在尝试将 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. 当一个对象被初始化为同类型对象的值时。

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