Articles of c ++ 14

Lambda captura como referência const?

É possível capturar por referência const em uma expressão lambda? Eu quero que a atribuição marcada abaixo falhe, por exemplo: #include #include #include #include using namespace std; int main() { string strings[] = { “hello”, “world” }; static const size_t num_strings = sizeof(strings)/sizeof(strings[0]); string best_string = “foo”; for_each( &strings[0], &strings[num_strings], [&best_string](const string& s) { best_string […]

Os literais compostos são padrão C ++?

Literais compostos são uma construção C99. Mesmo que eu possa fazer isso em C ++: #include using namespace std; int main() { for (auto i : (float[2]) {2.7, 3.1}) cout << i << endl; } Parece que, por exemplo, o MSVC o suporta como uma extensão . No entanto, todos os compiladores em que consigo […]

Resolução de sobrecarga entre object, referência de valor, referência const

Dadas todas as três funções, essa chamada é ambígua. int f( int ); int f( int && ); int f( int const & ); int q = f( 3 ); Remover f( int ) faz com que tanto o Clang quanto o GCC prefiram a referência rvalue sobre a referência lvalue. Mas, em vez disso, […]

Construtor padrão excluído. Objetos ainda podem ser criados … às vezes

O ingênuo, otimista e oh .. tão errado visão da syntax de boot uniforme c + + 11 Eu pensei que desde C + + 11 objects definidos pelo usuário devem ser construídos com a nova syntax {…} invés da antiga (…) syntax (exceto para o construtor sobrecarregado para std::initializer_list e parâmetros similares std::vector : […]

É # pragma uma vez parte do padrão C ++ 11?

Tradicionalmente, a maneira padrão e portátil de evitar múltiplas inclusões de header em C ++ era / é usar o esquema de diretivas de pré-compilador #ifndef – #define – #endif também chamado de esquema de macro guarda (veja o trecho de código abaixo). #ifndef MY_HEADER_HPP #define MY_HEADER_HPP … #endif Na maioria das implementações / compiladores […]

Inicializador de expressão constante para membro de class estática do tipo double

Em C ++ 11 e C ++ 14, por que preciso de constexpr no seguinte trecho: class Foo { static constexpr double X = 0.75; }; enquanto este produz um erro de compilador: class Foo { static const double X = 0.75; }; e (mais surpreendentemente) isso compila sem erros? class Foo { static const […]

Entendendo o exemplo na conversão de lvalue para rvalue

Eu tenho dificuldade em entender como este código (um exemplo do padrão de rascunho do C ++ 14 [conv.lval] ) invoca um comportamento indefinido para g(false) . Por que o constexpr faz o programa válido? Além disso, o que significa “não acessa yn “? Em ambas as chamadas para g() , estamos retornando o membro […]

Chamando o construtor initializer_list via make_unique / make_shared

Eu estou tentando usar std::make_unique para instanciar uma class cujo construtor é receber um std::initializer_list . Aqui um caso mínimo: #include #include #include #include struct Foo { Foo(std::initializer_list strings) : strings(strings) {} std::vector strings; }; int main(int, char**) { auto ptr = std::make_unique({“Hello”, “World”}); return 0; } Você pode ver no Coliru que ele não […]

Auto-boot de uma variável constexpr estática, é bem formada?

Dada a seguinte declaração no namespace global: constexpr int x = x; Isso é bem formado? O rascunho da seção padrão 3.6.2 C ++ 14 [basic.start.init] diz: Variáveis ​​com duração de armazenamento estático (3.7.1) ou duração de armazenamento de thread (3.7.2) devem ser inicializadas com zero (8.5) antes de qualquer outra boot ocorrer. […] O […]

Existe um nome para esse idioma de criação de tupla?

Na lista de discussão Boost , o seguinte truque inteligente para criar uma entidade semelhante a uma tupla foi postado recentemente por @LouisDionne: #include auto list = [](auto …xs) { return [=](auto access) { return access(xs…); }; }; auto length = [](auto xs) { return xs([](auto …z) { return sizeof…(z); }); }; int main() { […]