【发布时间】:2020-12-07 07:11:01
【问题描述】:
在 CRTP 中,基础对象可以return a reference to the derived object via static cast。
在多重继承的情况下也是如此吗?第二个基数及以后可能位于与派生对象不同的地址。例如考虑:
#include <iostream>
#include <string_view>
template<typename Derived>
struct Base1
{
char c1;
};
template<typename Derived>
struct Base2
{
char c2;
auto& get2() const
{
return static_cast<const Derived&>(*this); // <-- OK?
}
};
struct X : public Base1<X>, public Base2<X>
{
X(std::string_view d) : data{d} {}
std::string_view data;
};
int main()
{
auto x = X{"cheesecake"};
std::cout << x.get2().data << std::endl;
}
gcc 的未定义行为分析器says this is undefined behavior.
clang 的未定义行为分析器detects no problem.
标准是否说明了它们中的哪一个是正确的?
更新:
gcc 的 bug 已经在 trunk 上修复了。
【问题讨论】:
-
您打算为此提交错误报告吗?
-
Done。谢谢提醒!
标签: c++ language-lawyer multiple-inheritance undefined-behavior crtp