Если нужно передать владение указателем, то передают unique_ptr, если указатель без владения — сам указатель. Но почему во втором случае не передавать ссылку? Вопрос навеян кодовой базой LLVM и другими открытыми проектами.
Оба примера ниже отлично компилируются:
#include <memory>
#include <string>
int length1(const std::string& s)
{
return s.length();
}
int length2(const std::string *s)
{
return s->length();
}
int main() {
auto s = std::make_unique<std::string>("test");
return length1(*s) + length2(s.get());
}
причём, в режиме -O3 инструкции идентичны:
; length1(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
mov eax, DWORD PTR [rdi+8]
ret
; length2(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const*):
mov eax, DWORD PTR [rdi+8]
ret