2016-02-24 2 views
8

Я полностью расстроен этими спецификаторами, потому что я понимаю, что они делают, когда они сами по себе, но мне трудно понять, когда они используются друг с другом. Например, содержится некоторый код в дикой природе -static, constexpr, const - что они означают, когда все используются вместе?

namespace{ 
static constexpr char const *Hello[] = { "HelloString", "WorldString"}; 
... 
} 

что это вообще делает?

  • Зачем использовать статические, если вы уже находитесь в анонимном пространстве имен. И статические внутри классов имеют смысл (если вы не пишете C, которым не хватает пространства имен), без классов - почему?
  • Зачем использовать constexpr - нет причин использовать его здесь. не будет простой const?
  • , а затем const *Hello не имеет смысла для меня. Что здесь постоянно? Строки или указатель *Hello?

И, самое главное, он компилирует: /. Конечно, он будет компилироваться, потому что они действительные заявления, но что это значит?

+0

constexpr предполагает, что он использует C++ 11. Знание этого статического смысла снова имеет смысл, поскольку оно сделает поток инициализации безопасным. (магическая статика). И constexpr делает его пригодным для использования в местах, где он не будет работать с константой. – Totonga

+0

Я не думаю, что инициализация скаляра с помощью скопированных списков инициализации. –

+2

Почему волшебная статика и вопрос безопасности потока для инициализации времени загрузки, хотя ...? Какое параллельное выполнение будет происходить там? – IanH

ответ

6

Зачем использовать статические, если вы уже находитесь в анонимном пространстве имен?

Я не вижу причины для этого, если он не написан для совместимости с C++ 03.

Зачем использовать constexpr - нет причин использовать его здесь. не будет ли простая константа?

Опять же, здесь нет необходимости, но это означает, что это постоянная времени компиляции. Также обратите внимание, что constexpr здесь означает, что указатель равен constexpr, и устраняет необходимость в const после * (см. Следующую часть).

const *Hello не имеет смысла для меня. Что здесь постоянно? Строки или указатель * Привет?

const относится к левой стороне, если ничего там нет, и в этом случае оно действует справа. const слева от * означает, что указатель при разыменовании является константой, а справа означает, что он является постоянным указателем на что-то.

char const * ptr = "Foo"; 
ptr[0] = 'B'; //error, ptr[0] is const 

char * const ptr = "Foo"; 
ptr = new char[10]; //error, ptr is const 

char const * const ptr = "Foo"; //cannot assign to either ptr or *ptr 
constexpr char const* ptr = "Foo"; //same as above, constexpr replaced last const 

Я обнаружил, что this страница на правило «правой левой» действительно помогает с пониманием осложнено деклараций.