• <legend id='hIGZN'><style id='hIGZN'><dir id='hIGZN'><q id='hIGZN'></q></dir></style></legend>

  • <small id='hIGZN'></small><noframes id='hIGZN'>

    1. <i id='hIGZN'><tr id='hIGZN'><dt id='hIGZN'><q id='hIGZN'><span id='hIGZN'><b id='hIGZN'><form id='hIGZN'><ins id='hIGZN'></ins><ul id='hIGZN'></ul><sub id='hIGZN'></sub></form><legend id='hIGZN'></legend><bdo id='hIGZN'><pre id='hIGZN'><center id='hIGZN'></center></pre></bdo></b><th id='hIGZN'></th></span></q></dt></tr></i><div id='hIGZN'><tfoot id='hIGZN'></tfoot><dl id='hIGZN'><fieldset id='hIGZN'></fieldset></dl></div>
      <tfoot id='hIGZN'></tfoot>
        <bdo id='hIGZN'></bdo><ul id='hIGZN'></ul>

        static_cast 和 Implicit_cast 有什么区别?

        时间:2023-07-20

            <tbody id='agDoU'></tbody>

            <i id='agDoU'><tr id='agDoU'><dt id='agDoU'><q id='agDoU'><span id='agDoU'><b id='agDoU'><form id='agDoU'><ins id='agDoU'></ins><ul id='agDoU'></ul><sub id='agDoU'></sub></form><legend id='agDoU'></legend><bdo id='agDoU'><pre id='agDoU'><center id='agDoU'></center></pre></bdo></b><th id='agDoU'></th></span></q></dt></tr></i><div id='agDoU'><tfoot id='agDoU'></tfoot><dl id='agDoU'><fieldset id='agDoU'></fieldset></dl></div>
              <legend id='agDoU'><style id='agDoU'><dir id='agDoU'><q id='agDoU'></q></dir></style></legend>

              • <bdo id='agDoU'></bdo><ul id='agDoU'></ul>
                <tfoot id='agDoU'></tfoot>

                  <small id='agDoU'></small><noframes id='agDoU'>

                  本文介绍了static_cast 和 Implicit_cast 有什么区别?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  什么是implicit_cast?我什么时候应该更喜欢implicit_cast而不是static_cast?

                  What is implicit_cast? when should I prefer implicit_cast rather than static_cast?

                  推荐答案

                  我正在复制我对 在另一个地方回答此评论.

                  您可以使用 static_cast 进行向下转换.implicit_cast 并非如此.static_cast 基本上允许您进行任何隐式转换,以及任何隐式转换的反向操作(达到某些限制.如果涉及虚拟基类,则不能向下转换).但是implicit_cast接受隐式转换.没有向下转换,没有 void*->T*,没有 U->T 如果 T 只有 U 的显式构造函数.

                  You can down-cast with static_cast. Not so with implicit_cast. static_cast basically allows you to do any implicit conversion, and in addition the reverse of any implicit conversion (up to some limits. you can't downcast if there is a virtual base-class involved). But implicit_cast will only accept implicit conversions. no down-cast, no void*->T*, no U->T if T has only explicit constructors for U.

                  请注意,重要的是要注意强制转换和转换之间的区别.在下面没有演员进行

                  Note that it's important to note the difference between a cast and a conversion. In the following no cast is going on

                  int a = 3.4;
                  

                  但是从 double 到 int 的隐式转换发生了.诸如隐式转换"之类的东西不存在,因为转换始终是显式转换请求.boost::implicit_cast 的名称构造是使用隐式转换进行转换"的可爱组合.现在 boost::implicit_cast 的整个实现是这样的(解释了 此处):

                  But an implicit conversion happens from double to int. Things like an "implicit cast" don't exist, since a cast is always an explicit conversion request. The name construct for boost::implicit_cast is a lovely combination of "cast using implicit conversions". Now the whole implementation of boost::implicit_cast is this (explained here):

                  template<typename T> struct identity { typedef T type; };
                  template<typename Dst> Dst implicit_cast(typename identity<Dst>::type t)
                  { return t; }
                  

                  这个想法是为参数 t 使用一个非推导的上下文.这将避免以下陷阱:

                  The idea is to use a non-deduced context for the parameter t. That will avoid pitfalls like the following:

                  call_const_version(implicit_cast(this)); // oops, wrong!
                  

                  想要的是这样写出来

                  call_const_version(implicit_cast<MyClass const*>(this)); // right!
                  

                  编译器无法推断模板参数 Dst 应该命名的类型,因为它首先必须知道 identity 是什么,因为它是用于推导的参数.但它反过来又取决于参数 Dst(identity 可以明确地专门用于某些类型).现在,我们得到了一个循环依赖,标准只是说这样的参数是一个非推导的上下文,并且必须提供一个显式的模板参数.

                  The compiler can't deduce what type the template parameter Dst should name, because it first must know what identity<Dst> is, since it is part of the parameter used for deduction. But it in turn depends on the parameter Dst (identity could be explicitly specialized for some types). Now, we got a circular dependency, for which the Standard just says such a parameter is a non-deduced context, and an explicit template-argument must be provided.

                  这篇关于static_cast 和 Implicit_cast 有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:std、tr1 和 boost(作为命名空间和/或库)之间有什么区别? 下一篇:如何在 BOOST 中在一个线程中发送信号并在另一个线程中执行相应的插槽?

                  相关文章

                    <bdo id='2tCCC'></bdo><ul id='2tCCC'></ul>

                    <i id='2tCCC'><tr id='2tCCC'><dt id='2tCCC'><q id='2tCCC'><span id='2tCCC'><b id='2tCCC'><form id='2tCCC'><ins id='2tCCC'></ins><ul id='2tCCC'></ul><sub id='2tCCC'></sub></form><legend id='2tCCC'></legend><bdo id='2tCCC'><pre id='2tCCC'><center id='2tCCC'></center></pre></bdo></b><th id='2tCCC'></th></span></q></dt></tr></i><div id='2tCCC'><tfoot id='2tCCC'></tfoot><dl id='2tCCC'><fieldset id='2tCCC'></fieldset></dl></div>

                  1. <tfoot id='2tCCC'></tfoot>
                  2. <small id='2tCCC'></small><noframes id='2tCCC'>

                      <legend id='2tCCC'><style id='2tCCC'><dir id='2tCCC'><q id='2tCCC'></q></dir></style></legend>