Son*_*c78 14 c++ language-lawyer c++11 c++14
我为为什么类std::future而std::promise不用final说明符标记感到烦恼。该析构函数是不是虚拟的,这样为什么final不加入?基本原理是什么?
lub*_*bgr 19
看一下这个人为的(当然是荒谬的)示例std::vector:
template <class T>
struct Example : private std::vector<T> {
void doStuff(const T& t) { this->push_back(t); }
T retrieveStuff() { return this->operator[](0); }
};
Example<int> e;
e.doStuff(42);
std::cout << e.retrieveStuff() << "\n";
Run Code Online (Sandbox Code Playgroud)
这行得通,您不能进入UB std::vector::~vector是virtual因为您不能通过基类指针删除对象(public在那里需要继承)。
这里的继承只是实现细节。不推荐这样做,但是人们可能这样做了。一旦决定不通过make std::vector或其他容器类型破坏现有代码final,便坚持使用不同的词汇类型(如std::promise或)有意义std::future。
P.W*_*P.W 16
根据[推导] / 4:
除非另有说明,否则C ++标准库中指定的所有类型均应为非最终类型。
和std::future或std::promise不排除在外。
正如评论中提到的那样,此问题之前已经讨论过。库实现者是否可以自由地将final添加到非多态组件?。
解决此问题的方法是,该结论不被认为是缺陷:
除非库
final在规范中使用关键字,否则用户显然可以自由地从此类中派生,因此同样清楚地,库供应商也无权添加final重写器或类属性。
| 归档时间: |
|
| 查看次数: |
1541 次 |
| 最近记录: |