<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## addressof ### 頭文件: `"boost/utility.hpp"` 要取得一個變量的地址,我們要依賴于返回的值是否真的是這個變量的地址。但是,技術上重載`operator&`是有可能的,這意味著存有惡意的人可以破壞你的地址相關的代碼。`boost::addressof` 被用于獲得變量的地址,不管取址操作符是否被誤用。通過使用一些靈巧的內部機制,模板函數 `addressof` 確保可以獲得真實的對象及其地址。 ### 用法 為確保獲得一個對象的真實地址,你要使用 `boost::addressof`. 它定義在 `"boost/utility.hpp"`. 它常用于原本要使用 `operator&` 的地方,它接受一個參數,該參數為要獲得地址的那個對象的引用。 ``` #include "boost/utility.hpp" class some_class {}; int main() { some_class s; some_class* p=boost::addressof(s); } ``` 在進一步學習如何使用 `addressof`的細節前,了解一下`operator&`為何以及如何不一定會返回對象的地址是非常有用的。 ### 快速了解一下存有惡意的人 如果你真的,真的,真的需要重載 `operator&`, 或者只是想試驗一下操作符重載可能的用法,這的確很容易。當你重載 `operator&`時,它的語義肯定會與多數用戶(以及函數!)所期望的不同,所以千萬不要為了好玩而做這件事;除非有非常好的理由,否則不要去做它。以下有一段code-breaker代碼: ``` class codebreaker { public: int operator&() const { return 13; } }; ``` 對于這個類,任何人想獲取一個`codebreaker`實例的地址都會得到一個不可思議的數字13. ``` template <typename T> void print_address(const T& t) { std::cout << "Address: " << (&t) << '\n'; } int main() { codebreaker c; print_address(c); } ``` 這不難做到,但是在實際的代碼中這樣做有沒有好的理由?也許沒有,因為除非是用在局部的類上,否則它是不安全的。原因是,雖然獲取一個不完整類型的地址是合法的,但如果是要獲取一個帶有用戶自定義`operator&`的不完整類型的地址則是未定義的行為。因為我們不能保證這不會發生,所以我們最好不要重載 `operator&`. ### 迅速的解決方法 即使一個類的 `operator&` 被重載了,也還是有辦法獲得這個類的實例的真實地址。`addressof` 使用了一些幕后的巧妙方法\[6\]來獲得真實的地址,而不會受任何 `operator&` 的欺騙。如果你把函數(`print_address`)改為使用 `addressof`, 你就可以得到以下代碼: > \[6\] 非常出名的一種ingenious hack. ``` template <typename T> void print_address(const T& t) { std::cout << "&t: " << (&t) << '\n'; std::cout << "addressof(t): " << boost::addressof(t) << '\n'; } ``` 執行時,該函數將給出如下輸出(或類似于以下的輸出,因為準確的地址值取決于你的系統). ``` &t: 13 addressof(t): 0012FECB13 ``` 差不多就是這樣了!如果有什么情況讓你知道或懷疑一個類的`operator&`被重載了,而你又需要確保得到真實的地址(由于 `operator&` 被重載而變得不可信了), 你就應該使用 `addressof`. ### 總結 沒有多少有力的論點支持重載 `operator&`,\[7\] 但由于這是可能的,總有些人會這樣做。當你編寫一些需要依賴于獲得對象真實地址的代碼時,`addressof` 可以幫助你確保得到真實的地址。在編寫泛型代碼時,沒有辦法知道將會操作什么類型,因此如果需要獲取參數化類型的地址的話,就使用 `addressof`. > \[7\] 即使是定制的硬件設備驅動程序 當你需要獲得一個對象的真實地址時,使用 `addressof` ,不必管 `operator&` 的語義。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看