Представьте, что у нас есть заголовок foo.h
, содержащий следующее:
#ifndef FOO_H_
#define FOO_H_
namespace foo {
constexpr std::string_view kSomeString = "blah";
}
#endif // FOO_H_
Гарантируется ли foo::kSomeString
наличие внутренней ссылки в любой единице перевода, которая включает foo.h
? Различается ли это между C ++ 11 и C ++ 17?
В проекте стандарта [basic.link] / 3 говорится
Имя, имеющее область пространства имен, имеет внутреннюю связь, если это имя [...] не встроенной переменной энергонезависимого константного типа, которая не была явно объявлена как extern и ранее не была объявлена как имеющая внешнюю связь [...]
Но я не знаю, считается ли constexpr
"квалифицированным с учетом констант". Это где-то сказано в стандарте?
Предполагая, что это гарантированно имеет внутреннюю привязку, похоже, что не может быть проблем с ODR для этого использования, верно? (В отличие от того, что написано в этом ответе.)
constexpr
в объявлениях подразумеваетconst
в C ++ 11. В C ++ 14 и выше он подразумеваетconst
только для переменных, но не для функций-членов. - person Kerrek SB   schedule 08.09.2017