可变模板混合继承的可见性规则
Visibility rules for mixin inheritance with variadic template
考虑我从可变模板继承了整个参数列表。参数是如何继承的?
// snippet
template<typename... R>
class foo
: public R... {
public:
};
// ....
using foo_inst = foo<bar_1, bar_2>;
我试过了,似乎所有 R
都是继承公共的(不仅仅是第一个)。这是定义的行为吗?
我尝试了gcc和msvc(感谢jaggedSpire也与clang),都有相同的结果。编译器甚至没有提到任何警告。您可以在这里看到一个运行的示例:
是的,这是定义的行为。引用自14.5.3[temp.variadic]4
包扩张由模式和一个省略号,其实例化产生零个或多个列表中模式的实例化(如下所述)。模式的形式取决于上下文膨胀就发生了。包扩展可以在以下上下文中发生:
列表中的相关上下文是:
因此,在参数包扩展-在base-specifier-list(第10条);模式是 base-specifier .
class foo : public R...
中,模式为基指示符 public R
,使得由类型T1, T2, ... , Tn
组成的包扩展为public T1, public T2, ... , public Tn
。(前面句子中的省略号用于数学序列指定意义)
相关文章:
- 如何更改唯一指针向量的可见性
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 限制静态库中符号的可见性 (MSVC/Visual C++)
- 班级成员可见性C++
- 内联模板函数的可见性
- Clang 是否可以在使用可见性属性时生成导入库(不带 __declspec(dllexport))?
- std::mutex 的发布-获取可见性保证是否仅适用于关键部分?
- 符号可见性和 gcc 警告
- C++/libscreen 无法更新可见性
- 在 C++11 线程中,std::mutex 对内存可见性有什么保证?
- C++继承构造函数的可见性
- CRTP - 嵌套叶类类型的可见性
- C++模板 - 实例之间的通用操作和成员可见性
- 放松的订单和线程间可见性
- GCC 6.x警告有关Lambda可见性
- C++ 中的Shared_ptr和内存可见性
- 静态库中的符号可见性和操作
- 未直接继承的基模板类成员的可见性
- 从shm_open() mmap()更改对共享内存的可见性
- 可变模板混合继承的可见性规则