@ T.C. Вы правы, но я не ошибаюсь :). Я не поощрял брать его адрес. Я согласен, что ваше конкретное использование является ловушкой, но хотел бы отметить, что использование такого объекта в общем определении не является неправильным в целом.
тавьте, что у нас есть заголовок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
считается "const-квалифицированным". Стандарт где-то так говорит?
Предполагая, что это гарантированно имеет внутреннюю связь, кажется, что не может быть проблем с ODR для этого использования, верно? (В отличие от того, что говорится вэтот ответ.)