型名の後の single&
は左辺値参照を意味し、double&&
は右辺値参照または「推定参照」を意味し、Scott Meyers によってユニバーサル参照とも呼ばれることを理解しています。&&&
しかし、関数またはメソッドのシグネチャでトリプルを見たことはありません。それは何の略ですか?
次のコードは、 triple を使用してメソッドを生成します&&&
。
#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
。スイッチは(私が信じている)非標準です。-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++
。私の質問は、3 つのアンパサンドは何の略ですか? どうやら私は&&&
自分のコードに直接書くことはできません。c++filt
シンボルの解読が間違っているからですか? c++filt
Mac OS X 10.8 で提供されているシステムを使用しています。