我知道类似的问题,但仍然想了解所描述的警告是否毫无意义。
潜在的重复可能是:
但我仍然有一种感觉,这个问题是不同的。
让我们假设我有一个基类实现为NVI。
struct server_strategy
{
explicit server_strategy(std::string name) : name_{std::move(name)} {}
virtual ~server_strategy()=default;
zmq::message_t handle_message(zmq::message_t request)
{
// ...
}
std::string const& log_channel()const {return name_;}
private:
virtual zmq::message_t do_handle_message(zmq::message_t request) =0;
private:
const std::string name_;
};
编译此类会使Clang发出警告:
error: 'server_strategy' has no out-of-line virtual method definitions;
its vtable will be emitted in every translation unit [-Werror,-Wweak-vtables]
问题是关于=default
关键字,而不是虚拟析构函数的impl最终会落在哪里!
=default
在虚拟析构函数的上下文中有意义? 我的意思是,如果我明确地将虚拟析构函数声明为默认,我可能不想引入额外的.cpp文件,并且我知道编译器将为其实现选择任何转换单元。让图书馆作者避免这些警告,但转换为默认的虚拟析构函数而不是内联实现是很方便的,但事实证明库作者除了处理编译指示和条件定义宏之外别无选择正在使用哪个编译器来禁用这些警告。