我只在这里写它作为答案,因为我无法将其标记为与C++11: How to alias a function? 或How do I assign an alias to a function name in C++? 的重复。
可以使用以下方法创建别名:
constexpr auto get_colour = get_color;
// or
constexpr auto get_colour(get_color);
const auto get_colour = get_color;
// or
const auto get_colour(get_color);
优势:
auto get_colour = get_color;
// OR
auto get_colour(get_color);
是编译器将知道constexpr/const 版本不会更改get_colour,因此它可以直接将get_colour 调用映射到get_color。对于 none constexpr 版本,您将对存储的指针进行间接处理。
如果你有
#include <iostream>
#include <string>
std::string get_color()
{
return "green";
}
auto get_colour = get_color;
int main() {
std::cout << get_colour() << "\n";
}
您可以在 [QWORD PTR get_colour[abi:cxx11][rip]] 看到未内联的,因为 get_colour 可能会更改:
get_color[abi:cxx11]():
lea rdx, [rdi+16]
mov BYTE PTR [rdi+20], 110
mov rax, rdi
mov QWORD PTR [rdi], rdx
mov DWORD PTR [rdi+16], 1701147239
mov QWORD PTR [rdi+8], 5
mov BYTE PTR [rdi+21], 0
ret
.LC0:
.string "\n"
main:
push rbp
sub rsp, 32
mov rdi, rsp
call [QWORD PTR get_colour[abi:cxx11][rip]]
mov rdx, QWORD PTR [rsp+8]
mov rsi, QWORD PTR [rsp]
mov edi, OFFSET FLAT:_ZSt4cout
call std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
mov rdi, rax
mov edx, 1
mov esi, OFFSET FLAT:.LC0
call std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
mov rdi, QWORD PTR [rsp]
lea rax, [rsp+16]
cmp rdi, rax
je .L8
call operator delete(void*)
但对于constexpr 版本:
#include <iostream>
#include <string>
std::string get_color()
{
return "green";
}
constexpr auto get_colour = get_color;
int main() {
std::cout << get_colour() << "\n";
}
对get_colour的函数调用可以内联(get_color[abi:cxx11]()不被调用)但是生成的代码直接出现在main:中:
get_color[abi:cxx11]():
lea rdx, [rdi+16]
mov BYTE PTR [rdi+20], 110
mov rax, rdi
mov QWORD PTR [rdi], rdx
mov DWORD PTR [rdi+16], 1701147239
mov QWORD PTR [rdi+8], 5
mov BYTE PTR [rdi+21], 0
ret
.LC0:
.string "\n"
main:
push rbp
mov edx, 5
mov edi, OFFSET FLAT:_ZSt4cout
push rbx
sub rsp, 40
lea rbx, [rsp+16]
mov BYTE PTR [rsp+20], 110
mov rsi, rbx
mov QWORD PTR [rsp], rbx
mov DWORD PTR [rsp+16], 1701147239
mov QWORD PTR [rsp+8], 5
mov BYTE PTR [rsp+21], 0
call std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
mov rdi, rax
mov edx, 1
mov esi, OFFSET FLAT:.LC0
call std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
mov rdi, QWORD PTR [rsp]
cmp rdi, rbx
je .L8
call operator delete(void*)
或者使用对免费和会员功能都适用的完美转发:
void get_color() {
}
template <typename... Args>
auto get_colour(Args&&... args) {
return get_color(std::forward<Args>(args)...);
}
对于c++11需要添加 -> decltype(get_color(std::forward<Args>(args)...)):
template <typename... Args>
auto get_colour(Args&&... args) -> decltype(get_color(std::forward<Args>(args)...)) {
return get_color(std::forward<Args>(args)...);
}