- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一些代码。它不起作用。
首先,您会看到这个示例代码片段并思考“为什么?”但请相信我:这是有原因的。
代码如下:
class LinkedListNode
// blaa
{
public:
LinkedListNode ( void* p )
{
// blaa
}
} ;
template <typename T>
class InheritAndLinkList
: public virtual T
, public LinkedListNode
{
public:
InheritAndLinkList ()
: LinkedListNode ( static_cast<void*>(static_cast<T*>(this)) ) // an exception occurs here when ..... (scroll down)
{ }
} ;
template <typename T>
class Implements
: public virtual InheritAndLinkList<T>
{ } ;
class A
{
public:
virtual void goA () =0 ;
} ;
class B
: public Implements<A>
{
public:
virtual void goB () =0 ;
} ;
class MyClass
: public Implements<B>
{
public:
virtual void goA ()
{
// blaa
}
virtual void goB ()
{
// blaa
}
} ;
int main ( ... )
{
MyClass * p = new MyClass () ; // ..... This line executes
p->goA() ;
p->goB() ;
return 0 ;
}
具体错误是,在构造时,表达式 static_cast<T*>(this)
导致段错误....... 使用英特尔 C++ 编译器时。这已经在 GCC、LLVM、MS Visual Studio 等许多版本上工作了多年。现在 ICPC 让它死了。
我相信这是一件完全正确的事情。调用此行时,T
已经构建并且应该可以有效使用...除非 C++ 规范中有关于此的另一件奇怪的事情。
将 static_cast
在构造函数主体中(并更改其 super 以匹配)导致它避免此段错误。
所以我的问题是:规范中的哪个地方说这个[static cast] 是/不安全?
最佳答案
就其值(value)而言,代码对我来说看起来还不错。在使用 static_cast
时,我看不出有任何争议。 - 它是普通的派生到基指针转换。对我来说看起来像是一个编译器错误。
如果你坚持章节和诗歌:
[expr.static.cast]/4 An expression
e
can be explicitly converted to a typeT
using astatic_cast
of the formstatic_cast<T>(e)
if the declarationT t(e);
is well-formed, for some invented temporary variablet
(8.5). The effect of such an explicit conversion is the same as performing the declaration and initialization and then using the temporary variable as the result of the conversion.
所以我们正在查看 T t(this);
的有效性在 InheritAndLinkList<T>
的构造函数中- 直接初始化:
[dcl.init]/17 ...
-- Otherwise, the initial value of the object being initialized is the (possibly converted) value of the initializer expression. Standard conversions (Clause 4) will be used, if necessary, to convert the initializer expression to the cv-unqualified version of the destination type; no user-defined conversions are considered.
.
[conv.ptr]/3 A prvalue of type “pointer to cv
D
”, whereD
is a class type, can be converted to a prvalue of type “pointer to cvB
”, whereB
is a base class (Clause 10) ofD
. IfB
is an inaccessible (Clause 11) or ambiguous (10.2) base class ofD
, a program that necessitates this conversion is ill-formed. The result of the conversion is a pointer to the base class subobject of the derived class object.
编辑
经过激烈的评论讨论,使用this
从构造函数初始化列表中获取并不是那么简单 - 但我相信您的特定用途仍然合法。
[class.cdtor]/3 To explicitly or implicitly convert a pointer (a glvalue) referring to an object of class
X
to a pointer (reference) to a direct or indirect base classB
ofX
, the construction ofX
and the construction of all of its direct or indirect bases that directly or indirectly derive fromB
shall have started and the destruction of these classes shall not have completed, otherwise the conversion results in undefined behavior... [Example:struct A { };
struct B : virtual A { };
struct C : B { };
struct D : virtual A { D(A*); };
struct X { X(A*); };
struct E : C, D, X {
E() : D(this), // undefined: upcast from E* to A*
// might use path E* ! D* ! A*
// but D is not constructed
// D((C*)this), // defined:
// E* ! C* defined because E() has started
// and C* ! A* defined because
// C fully constructed
X(this) { // defined: upon construction of X,
// C/B/D/A sublattice is fully constructed
}
};— end example ]
您的情况类似于 X(this)
在上面的例子中,实际上比那个更简单,因为你只在层次结构中向上移动了一个步骤,所以没有需要关心的中间类。
关于C++ 虚拟继承 : static_cast "this" to virtual parent in initializer list of derived,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38487640/
如果我需要选择第 10 个父级,是否有更简洁的方法,然后重复 .parent() 10 次? $('#element_id').parent().parent().parent().parent().
从 angularJS 指南中的“如何创建通信指令”开始,https://docs.angularjs.org/guide/directive , 我正在尝试使用该布局来制作可导航的表单。 问题在于指
我有一个 jQuery 函数,需要获取元素父元素的位置。 它看起来像: function show(e) { //debugger; var nextTab
我正在尝试修复这个难看的代码。 RadGrid gv = (RadGrid) (((Control) e.CommandSource).Parent.Parent.Parent.Parent.Pare
我有一个 A 标签,可以触发它的曾曾曾祖 parent 的动画。以下所有方法都可以,但哪一个最有效,为什么? $(this).parent().parent().parent().parent().p
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
我在尝试定位绝对定位的 div 时遇到了一些问题。我猜它的工作方式应该是这样,但是我希望它与父对象的父对象而不是父对象一起使用,因为我有一个下拉列表,当我希望它像第一个一样保持在顶部时,它会跟随父对象
我正在做一些非常基本的 jQuery 东西,真正开始,我经常通过做类似的事情来向上导航 dom $(this).parent().parent().addClass('hello'); 我只是想知道是
此 HTML 结构有一个 div#page,其中当前页面内容将通过 Ajax 加载。内容始终由 section 标记组成,这些标记可以具有动态高度(相对于浏览器的百分比)或静态高度(以像素为单位)。
在 javascript 中是否有一种简单的方法来定位父对象的父对象? 我使用 this.parentNode 作为函数的元素来选择父节点,我尝试了 this.parent.parentNode 和
当遍历 pager.Pages 对象的 foreach 循环时,$data 是 self(正如预期的那样)。但是,$parent 应该是寻呼机对象,但它返回的是 WaterQualityResultV
在架构中,我想根据父级的 sibling 调整架构。 例如:如果 toggleMonday 为真,那么 weekdays -> monday 应该有一个特定的验证模式。 现在下面的例子有效。但是,它非
我想要完成的是,当用户将焦点放在文本框上时,其中的字段集将添加一个类“active_fieldset”,以便提供用户在表单中的位置的良好视觉提示。使用以下 javascript,它确实会影响父字段集,
我创建了这个函数来保存我的taches sauverTache(tache:Tache){ this.editionEnCours = true; tache.estReelle =
所以..这是我的问题..我有以下代码(示例): var GameObject = function (posX, posY, width, height) { this.posX = posX;
所以,我是 jQuery 的新手,我正在尝试更改关于函数触发器的 2 个级别的 div: 这是我的第一次尝试:我尝试找到最接近的“.node”,它是所有其他 div 的父级并编辑子 div。 fun
我想了解为什么使用 ng-repeat在repeat 的item 上有某个controller,那个item 的parent 和那个item 的祖父是同一个controller。我期待祖父成为父 Co
我想从我的组件 Controller 之一将 jsonModel 设置为我的 SAPUI5 组件。在组件内,我使用应用程序或 splitapp。 我想避免通过 ID 获取元素。从组件内的某个位置获取层
我不确定如何在标题上准确地表达出来,因为问题在我的场景中太具体了,但无论如何基本上我有两个类似于下面的外部类: class Config { public level: number = 1;
在我正在编写的这个脚本中,我发现自己连续使用 .parent() 最多七次来获取元素。虽然这有效,但似乎可以/应该有一种更简单的方法来完成我不知道的这个/功能。除了更多元素上更具体的类/ID 之外,还
我是一名优秀的程序员,十分优秀!