我知道在类型名之后,单&
表示左值引用,双&&
表示右值引用或“推导引用”,斯科特迈耶斯也将其称为通用引用。但我从未&&&
在函数或方法签名中看到过三元组。它代表什么?
下面的代码产生一个带有三元组的方法&&&
:
#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++
. 所以我的问题是,三和符号代表什么?显然我不能&&&
直接写我的代码。是因为我c++filt
的符号分解不正确吗?我正在使用c++filt
Mac OS X 10.8 上提供的系统。