gpt4 book ai didi

c++ - 奇怪的 C4512 警告。为什么?

转载 作者:可可西里 更新时间:2023-11-01 17:51:53 27 4
gpt4 key购买 nike

采用以下使用 boost::asio 的代码。

#include <boost/asio.hpp>

using boost::asio::ip::tcp;

class SocketTest
{

private:

boost::asio::io_service& mIOService;
tcp::acceptor mAcceptor; // Comment this line

public:

SocketTest(boost::asio::io_service& io_service)
: mIOService(io_service)
, mAcceptor(io_service, tcp::endpoint(tcp::v4(), 8080)) // Comment this line
{
}
};

如果您注释这两个标记行,编译器 (Visual Studio 2010) 在/W4 上编译时会发出以下警告。

warning C4512: 'SocketTest' : assignment operator could not be generated

是什么让这两条线如此特别?为什么它们的存在会产生赋值运算符?

最佳答案

这种行为的原因是tcp::acceptor是不可复制的(它继承自basic_io_object,它的复制赋值运算符是私有(private)的,所以它自己的复制赋值运算符未隐式声明)。拥有不可复制的成员可避免生成隐式声明的复制赋值运算符,但不会引发警告,因为这被认为是预期的行为。

另一方面,如果您注释掉这两行,您的类将只剩下一个引用成员;这也使您的类不可复制,但根据 Visual Studio 文档确实会发出警告。我同意这也是意料之中的,但编译器实现者决定给你一个警告以防万一。原因可能是使一个类显式不可复制(例如 basic_io_object 的情况)是一个明确的设计决策,但我只是在这里猜测。

关于c++ - 奇怪的 C4512 警告。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13719461/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com