【发布时间】:2021-08-28 08:55:22
【问题描述】:
给定这个类层次结构:
#include <iostream>
class Base {
public:
Base() = default;
Base(const Base&) { std::cout << " copy\n"; }
template<typename T>
Base(T&&) { std::cout << " T&&\n"; }
};
class Sub : public Base {
public:
using Base::Base;
};
is known 这段代码将打印T&&:
// objects
Base varObj;
const Base constObj;
// invoking constructors
Base copy(varObj); // T&&
Base move(std::move(constObj)); // T&&
Base number(42); // T&&
为什么使用Sub 而不是Base “修复”问题?
// objects
Sub varObj;
const Sub constObj;
// invoking constructors
Sub copy(varObj); // copy
Sub move(std::move(constObj)); // copy
Sub number(42); // T&&
【问题讨论】:
-
fyi 注释掉
using Base::Base;我得到 cland 和 gcc 之间的编译器差异 - 实时 - godbolt.org/z/WMG5xTodz -
移动 const 对象是一种不好的做法。由于源对象是常量,不能修改,所以你会得到一个副本,这会使代码产生误导。
-
@RichardCritten,有趣的是
Sub number(42);然后调用T&&构造函数两次。但是,这只发生在-std=c++20上。使用 C++17 GCC 会产生与 Clang 相同的错误。它看起来像是 GCC 10 引入的回归。
标签: c++ c++17 language-lawyer perfect-forwarding