簡體   English   中英

在C ++中,三連號&&&代表什么?

[英]What does triple ampersand `&&&` stand for in C++?

我知道在類型名之后,單號&表示左值引用,雙號&&表示右值引用或“推導引用”,也稱為Scott Meyers的通用引用 但是我從未見過函數或方法簽名中的三元組&&& 它代表什么?

以下代碼生成具有三重&&&的方法:

#include <iostream>
#include <utility>

template<typename ostream> void foo(ostream&& out) {
    out << "foo" << std::endl;
}

template<typename ostream> void bar(ostream&& out) {
    foo(std::forward<ostream>(out));
}

int main() {
    bar(std::cout);
}

g++-4.8.1編譯代碼后,我運行nm -j a.out | c++filt nm -j a.out | c++filt -j開關是非標准的(我相信),這意味着僅顯示符號名稱(無值或類型)。 我得到這個:

__GLOBAL__sub_I_triple_ampersand.cpp
void bar<std::ostream&>(std::ostream&&&)
void foo<std::ostream&>(std::ostream&&&)
__static_initialization_and_destruction_0(int, int)
std::ostream::operator<<(std::ostream& (*)(std::ostream&))
std::ios_base::Init::Init()
std::ios_base::Init::~Init()
std::cout
std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)
std::ostream&&& std::forward<std::ostream&>(std::remove_reference<std::ostream&>::type&)
std::piecewise_construct
std::__ioinit
std::basic_ostream<char, std::char_traits<char> >& std::operator<<<std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
___cxa_atexit
__mh_execute_header
_main
dyld_stub_binder

使用clang++編譯時,我得到類似的輸出。 所以我的問題是,三連號代表什么? 顯然,我無法直接在代碼中編寫&&& 是因為我的c++filt錯誤地分解了符號嗎? 我正在Mac OS X 10.8上使用系統提供的c++filt

  • 您將模板參數命名為ostream並使用std::ostream&實例化它的事實令人困惑。

  • 有一個在demangling一個小錯誤(應該已經把空間打破的組&作為其含義是& && ,而不是&& &但連續的存在&自己不是一個問題:另一種方式來還原函數該名稱將是void bar<$T=std::ostream$&>($T$&&) ,即,整齊的名稱包含對參數的反向引用,而不是類型本身的擴展。

  • 為什么? 通常,實例化的名稱必須代表精確的實例化模板及其參數(而不是使用諸如崩潰規則或擴展對特征的引用所產生的簽名)作為相同名稱的兩個不同功能模板的實例化在同一簽名中可以有效地合並在程序中(我認為它們不能在編譯單元中,但是在C ++中,名稱查找和重載解析是如此復雜,以至於我可能會誤解),並且使用簡化簽名將無法充分合並它們。 在具有特征的示例中,我目前無法想到具有參考折疊規則(*)的特征,后面的兩個功能模板可能會在程序中重載(即使在同一CU中)

     template <typename T> struct Traits{}; template <typename T> void f(typename Traits<T>::T1) { return; } template <typename T> void f(typename Traits<T>::T2) { return; } 

    但是,如果您具有以下特質特長

     template <> struct Traits<int> { typedef int T1; typedef int T2; }; 

    您不能在模糊不清的地方使用f<int>(42) ,但是通過選擇性地使它們可見,您可以在一個CU中使用一個,而在另一個CU中使用另一個,因此處理必須能夠有所作為。

(*)可能沒有,我不記得曾經提到過,一旦該機制必須到位(另一個原因是要限制錯誤名稱的大小),它更安全,也可能更容易繼續將其用於所有內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM