Я играю с перегрузкой операторов в С++ 14, и я попытался сопоставить два типа аргументов: any-old-const- char * и a-string-literal.
То есть, я пытаюсь понять, могу ли я различать:
const char * run_time;
и
"compile time"
Я написал код ниже, и, как показано, при попытке span >> "literal"
он вызвал функцию const char*
.
Когда я #if 0
-выход версии const char*
, версия шаблона называется просто тонкой.
Если я изменю версию шаблона, чтобы взять параметр rvalue-reference (& &) для literal
, он не компилируется.
Если я добавлю версию const char (&literal)[]
без шаблонов, версия const char*
по-прежнему предпочтительна. Удаление версии const char * предпочтительнее версия шаблона.
Вы можете это объяснить? В частности:
- Почему
const char*
предпочтительнееconst char (&)[N]
? - Почему
const char (&)[N]
предпочтительнееconst char (&)[]
(не шаблон)? - Почему
const char (&&)[N]
невозможно выполнить компиляцию? - Есть ли "правильный путь" для записи литеральных строк?
Спасибо.
#include <iostream>
using namespace std;
#include <gsl/gsl>
#include <type_name.h++>
template<unsigned N>
auto
operator>>(gsl::span<const char*,-1>& spn, const char (&literal)[N])
-> gsl::span<const char*, -1>&
{
cout << "Got array: " << literal << endl;
return spn;
}
auto
operator>>(gsl::span<const char*,-1>& spn, const char *literal)
-> gsl::span<const char*, -1>&
{
cout << "Got const-char*: " << literal << endl;
return spn;
}
#if 0
#endif
int
main(int argc, const char *argv[])
{
auto spn = gsl::span<const char*>(argv, argc);
cout << type_name<decltype(spn)>() << endl; // gsl::span<const char *, -1>
cout << type_name<decltype("literal")>() << endl; // char const (&)[8]
cout << type_name<decltype(("literal"))>() << endl; // char const (&)[8]
auto helpx = "literal";
cout << type_name<decltype(helpx)>() << endl; // const char *
spn >> "literal"; // Got const-char*: literal
return 0;
}
Edit:
В случае, если это имеет значение, я компилирую с помощью:
c++ --std=c++14 -Iinclude -c -o main.o main.c++
И С++ говорит:
$ c++ --version
Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin16.5.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin