c++11- все статьи тега


Пакет параметров должен быть в конце списка параметров... когда и почему?

Я не понимаю, почему пакет параметров должен быть в конце списка параметров, если последний привязан к классу, в то время как ограничение ослабляется, если список параметров является частью объявления метода-члена. Другими словами, этот компилирует: class C { template<typename T, typename... Args, typename S> void fn() { } }; Следующий не делает: template<typename T, typename... Args, typename S> class C { }; Почему первый случай считается правильным, а второй-нет? Я ...

C++11: зависит ли std:: thread в linux от библиотеки pthread?

Я читал, что pthread является библиотекой C и не совместим с объектной моделью C++, особенно когда речь идет об обработке исключений. Итак, я хочу знать в системе linux, как GCC / clang реализует std::thread, вызывает ли он некоторые собственные функции linux / API ядра или что-то еще? Также, как реализуется std::thread_local, связанный с __thread? ...

Создание экземпляра shared ptr с помощью make shared

Рассмотрим следующий код: class A { .... shared_ptr<std::thread> mThread; void Step(); void LaunchTrhead(); } void A::LaunchThread() { ... mThread=make_shared<std::thread>(Step); // This line gives an error ... } void A::Step() { ... } Я пытаюсь инициализировать общий указатель mThread так, чтобы он вызывал функцию Step. Однако компилятор выдает мне ошибку "недопустимая инициализация ссылки типа ... из выражения типа "неразрешенный перегруженны ...

конвертировать из char в char16 t

Мой конфиг: компилятор: gnu gcc 4.8.2 я компилирую с C++11 Платформа / ОС: Linux 64bit Ubuntu 14.04.1 LTS У меня есть такой метод: static inline std::u16string StringtoU16(const std::string &str) { const size_t si = strlen(str.c_str()); char16_t cstr[si+1]; memset(cstr, 0, (si+1)*sizeof(char16_t)); const char* constSTR = str.c_str(); mbstate_t mbs; memset (&mbs, 0, sizeof (mbs));//set shift state to the initial state size_t ret = mbrtoc16 (cstr, constS ...

Есть ли способ подавить ошибки Intellisense при использовании функций C++11, специфичных для ноября 2012 CTP?

Мой код компилируется и работает просто отлично (пока...), однако, поскольку Intellisense Visual Studio еще не поддерживает новые функции C++11 для компилятора CTP 2012: Наличие кусков совершенно хорошего (хотя и экспериментального) кода, подчеркнутого красным, имеет тенденцию немного сбивать меня с толку. Есть ли способ заставить Intellisense игнорировать ошибки в определенных местах? Может ли кто-нибудь порекомендовать IDE, которая уже предлагает правильную подсветку синтаксиса и проверку э ...

Почему работают std:: shared ptr

Я нашел некоторый код, использующий std:: shared_ptr для выполнения произвольной очистки при завершении работы. Сначала я думал, что этот код не может работать, но затем я попробовал следующее: #include <memory> #include <iostream> #include <vector> class test { public: test() { std::cout << "Test created" << std::endl; } ~test() { std::cout << "Test destroyed" << std::endl; } }; int main() { std::cout << "At begin of main.nc ...

Как кодирование файлов влияет на строковые литералы C++11?

Вы можете написать строковые литералы UTF-8/16/32 в C++11, добавив к строковому литералу префикс u8/u/U соответственно. Как компилятор должен интерпретировать файл UTF-8, содержащий символы, отличные от ASCII, внутри этих новых типов строковых литералов? Я понимаю, что стандарт не определяет кодировки файлов, и один этот факт сделает интерпретацию символов, не являющихся ASCII, в исходном коде полностью неопределенным поведением, что делает эту функцию чуть менее полезной. I поймите, вы все еще ...

reserve () реализация для std:: vector в STL

Рассмотрим эту реализацию std:: vector:: reserve () из книги " Язык программирования C++, 4-е изд., Бьярне Страуструп: template<class T, class A> void vector<T,A>::reserve(size_type newalloc) { if (newalloc<=capacity()) return; vector_base<T,A> b {vb.alloc,newalloc}; // get new storage // (see PS of question for details on vb data member) T* src = elem; // ptr to th ...

Как проверить наличие поддержки C++11?

Есть ли способ определить во время компиляции, поддерживает ли компилятор определенные функции C++11? Например, что-то вроде этого: #ifndef VARIADIC_TEMPLATES_SUPPORTED #error "Your compiler doesn't support variadic templates. :(" #else template <typename... DatatypeList> class Tuple { // ... } #endif ...

Вариадическое пользовательское преобразование / конструктор

Учитывая следующий векторный класс (предназначенный для 2d, 3d или 4d векторной математики), который использует std::array, можно ли определить вариадический конструктор и/или конструктор преобразования? В качестве последующего вопроса, Является ли это плохой практикой? Я нахожу, что мне нужно конвертировать в-из целого числа, float и double довольно много. Я знаю, что неявные преобразования будут происходить, но мой компилятор будет предупреждать меня об этом (я не хочу отключать их вообще ...

Инициализация QByteArray

Я могу инициализировать QByteArray как: QByteArray m_data; m_data[0] = 0x0c; m_data[1] = 0x06; m_data[2] = 0x04; m_data[3] = 0x04; m_data[4] = 0x02; m_data[5] = 0x00; Но я хотел бы что-то более компактное, например: QByteArray m_data{0x0c, 0x06, 0x04, 0x04, 0x02, 0x00}; К сожалению, эта форма не разрешена: error: could not convert '{12, 6, 4, 4, 2, 0}' from '<brace-enclosed initializer list>' to 'QByteArray' QByteArray m_data{0x0c, 0x06, 0x04, 0x04, 0x02, 0x00}; ...

Почему copy elision не работает с std:: move?

Я использую приведенный ниже код для тестирования копирования elision: class foo { public: foo() {cout<<"ctor"<<endl;}; foo(const foo &rhs) {cout<<"copy ctor"<<endl;} }; int g(foo a) { return 0; } int main() { foo a; g(std::move(a)); return 0; } Я ожидал, что будет вызван только конструктор по умолчанию, потому что аргумент g() является rvalue и копия будет удалена. Но результат показывает, что вызываются как конструктор по умолчанию, так ...

Как справиться с предупреждением "exit-time destructor" в clang?

В моем коде C++11 я получаю предупреждение clang "объявление требует деструктора времени выхода"в следующем случае: static const std::map<int, const someStruct> mymap = { {1, { "A", "B", "C" }}, {2, { "D", "E", "F" }} }; Насколько я понимаю Google, "деструктор времени выхода" необходим для уничтожения main() и статики детерминированным способом, чтобы предотвратить сбои при выходе из-за"уже выпущенных переменных". Это прав ...

Рефакторинг структуры if-else-if

Как я могу изменить следующий код C++? Я использую C++11 в своей программе void f(int a, int b, int c, int d, int e, int f) { // MAX1..MAX6 are constants, N1..N6 are constants if( a > MAX1) { .. code block 1.. } else if(b > MAX2) { .. code block 2.. } else if(c > MAX3) { .. code block .. } else if(d > MAX4) { .. code block 3 .. } else if(e > MAX5) { .. code block 4 .. } else if(f > MAX6) { ...

std:: список инициализаторов с несколькими типами

У меня возникли проблемы с std::initializer_list. Я свел его к простому примеру: #include <initializer_list> #include <cstdio> class Test { public: template <typename type> Test(const std::initializer_list<type>& args) {} }; int main(int argc, char* argv[]) { Test({1,2}); getchar(); return 0; } При компиляции с использованием g++ test_initializer.cpp -std=c++0x, он компилируется и работает хорошо. Однако, если строка 11 заменена на Te ...

Можно ли получить возвращаемое значение функции потока в C++11?

Если функция имеет не пустое возвращаемое значение и я соединяю его с помощью функции .join, то есть ли способ получить ее возвращаемое значение? Вот упрощенный пример: float myfunc(int k) { return exp(k); } int main() { std::thread th=std::thread(myfunc, 10); th.join(); //Where is the return value? } ...

Что такое использование ref-квалификатора ' const &&'?

Я немного покопался в ref-квалификаторах, следуя за предыдущим вопросом. Приведен пример кода ниже; #include <iostream> #include <string> #include <utility> struct A { std::string abc = "abc"; std::string& get() & { std::cout << "get() &" << std::endl; return abc; } std::string get() && { std::cout << "get() &&" << std::endl; return std::move(abc); } std::string const& get() const & { ...

C++ template class static const переменный член как ключ карты дает неопределенную ссылку

У меня есть куча классов, которые имеют статический член, который является значением enum. И у меня есть карта где-то еще с этим перечислением в качестве ключа. Теперь, если я использую параметр шаблона в функции для доступа к карте, я получаю неопределенную ссылку. Чтобы было понятно, вот упрощенный нерабочий пример: template<int T> struct A { static const int Type = T; } template<class T> void fun() { cout << map_[T::Type] << endl; } map<int, str ...

Понимание слабого счетчика ссылок

При создании shared_ptr объект диспетчера использует сильные и слабые счетчики ссылок. Я понимаю, что при использовании сильного счетчика ссылок shared_ptr знает, когда освободить управляемый объект, но я не понимаю, почему он использует слабый счетчик ссылок. ...

Как использовать noexcept в C++ или как это работает?

Я не могу понять использование и назначение ключевого слова noexcept in в C++11/14. Я имею в виду, что это сигнатура для тех функций, которые не испускают exceptions. Но действительно ли это работает? Посмотрите на этот код ниже: #include <iostream> #include <bits/stdc++.h> using namespace std; void seev (vector<int> &v) noexcept; void seev (vector<int> &v) noexcept { for (int i=0;i<10;++i) { cout<<v.at(i)<<' '; } } int main() ...