Вопросы с тегом «c++»

C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который будет скомпилирован с помощью компилятора C ++). Используйте тег, зависящий от версии, для вопросов, связанных с конкретной редакцией стандарта [C ++ 11], [C ++ 14], [C ++ 17] или [C ++ 20] и т. Д.

2
Назначенные инициализаторы в C ++ 20
У меня есть вопрос об одной из функций c ++ 20, назначенных инициализаторах (подробнее об этой функции здесь ) #include <iostream> constexpr unsigned DEFAULT_SALARY {10000}; struct Person { std::string name{}; std::string surname{}; unsigned age{}; }; struct Employee : Person { unsigned salary{DEFAULT_SALARY}; }; int main() { std::cout << std::boolalpha << …

3
Разрешено ли компилятору постоянно сворачивать локальную переменную?
Рассмотрим этот простой код: void g(); void foo() { volatile bool x = false; if (x) g(); } https://godbolt.org/z/I2kBY7 Вы можете видеть , что ни gccни clangоптимизируют из потенциального вызова g. В моем понимании это правильно: абстрактная машина должна предполагать, что volatileпеременные могут измениться в любой момент (например, из-за аппаратного …

3
какой случай использования для явного (bool)
В C ++ 20 введен явный (bool), который условно выбирает во время компиляции, сделан ли конструктор явным или нет. Ниже приведен пример, который я нашел здесь . struct foo { // Specify non-integral types (strings, floats, etc.) require explicit construction. template <typename T> explicit(!std::is_integral_v<T>) foo(T) {} }; foo a = …
24 c++  c++20  explicit 


1
Почему `decltype (static_cast <T> (…))` не всегда `T`?
Для следующего кода проходят все, кроме последнего утверждения: template&lt;typename T&gt; constexpr void assert_static_cast_identity() { using T_cast = decltype(static_cast&lt;T&gt;(std::declval&lt;T&gt;())); static_assert(std::is_same_v&lt;T_cast, T&gt;); } int main() { assert_static_cast_identity&lt;int&gt;(); assert_static_cast_identity&lt;int&amp;&gt;(); assert_static_cast_identity&lt;int&amp;&amp;&gt;(); // assert_static_cast_identity&lt;int(int)&gt;(); // illegal cast assert_static_cast_identity&lt;int (&amp;)(int)&gt;(); assert_static_cast_identity&lt;int (&amp;&amp;)(int)&gt;(); // static assert fails } Почему это последнее утверждение не выполняется и static_cast&lt;T&gt;не всегда …
24 c++  static-cast 

3
C ++ 20 Основные понятия: какая специализация шаблона выбирается, когда аргумент шаблона соответствует нескольким понятиям?
Данный : #include &lt;concepts&gt; #include &lt;iostream&gt; template&lt;class T&gt; struct wrapper; template&lt;std::signed_integral T&gt; struct wrapper&lt;T&gt; { wrapper() = default; void print() { std::cout &lt;&lt; "signed_integral" &lt;&lt; std::endl; } }; template&lt;std::integral T&gt; struct wrapper&lt;T&gt; { wrapper() = default; void print() { std::cout &lt;&lt; "integral" &lt;&lt; std::endl; } }; int main() { wrapper&lt;int&gt; …

1
Почему размер класса в c ++ зависит от публичного / частного статуса членов данных?
Из того, что я знаю, размер класса в C ++ зависит от следующих факторов: Размер всех нестатических элементов данных. Порядок данных членов. Если заполнение байтов включено или нет. Размер его непосредственного базового класса. Существование виртуальных функций. Режим наследования (виртуальное наследование). Теперь я создал 2 класса, как показано ниже - class …

2
Почему эта функция шаблона не работает должным образом?
Я читал о шаблонных функциях и запутался в этой проблеме: #include &lt;iostream&gt; void f(int) { std::cout &lt;&lt; "f(int)\n"; } template&lt;typename T&gt; void g(T val) { std::cout &lt;&lt; typeid(val).name() &lt;&lt; " "; f(val); } void f(double) { std::cout &lt;&lt; "f(double)\n"; } template void g&lt;double&gt;(double); int main() { f(1.0); // f(double) f(1); …

3
Отличие поведения изменяемого захвата лямбда-функции от ссылки на глобальную переменную
Я обнаружил, что результаты в разных компиляторах различны, если я использую лямбду для захвата ссылки на глобальную переменную с изменяемым ключевым словом, а затем изменяю значение в лямбда-функции. #include &lt;stdio.h&gt; #include &lt;functional&gt; int n = 100; std::function&lt;int()&gt; f() { int &amp;m = n; return [m] () mutable -&gt; int { …

1
'auto' как заполнитель аргумента шаблона для параметра функции
C ++ 20 позволяет использовать autoдля параметра типа функции. Позволяет ли он также использовать autoв качестве заполнителя аргумента шаблона (не похоже, но в духе C ++ 17 template &lt;auto&gt; в некотором смысле) для типа параметра функции? Итак, следующий код, предварительно C ++ 20: template&lt;typename First, typename Second&gt; void printPair(const std::pair&lt;First, …
22 c++  templates  auto  c++20 

1
Использование переменной в собственном инициализаторе
[basic.scope.pdecl] / 1 стандартного черновика C ++ 20 содержал в примечании следующий (ненормативный) пример (частичная цитата до запроса на объединение 3580 , см. ответ на этот вопрос): unsigned char x = x; [...] x инициализируется своим собственным (неопределенным) значением. Это на самом деле имеет четко определенное поведение в C ++ …

6
Инициализация переменной неизвестного типа через перегруженные конструкторы в C ++
Исходя из опыта работы с Python, я немного боролся с работой с типами в C ++. Я пытаюсь инициализировать переменную класса через один из нескольких перегруженных конструкторов, которые принимают разные типы в качестве параметров. Я прочитал, что использование autoключевого слова может быть использовано для автоматического объявления переменной, однако в моем …

3
Хранитель shared_ptr хранится в памяти, выделенной пользовательским распределителем?
Скажем, у меня есть shared_ptrпользовательский распределитель и пользовательский удалитель. Я не могу найти в стандарте ничего, что говорит о том, где должен храниться удалитель: он не говорит, что пользовательский распределитель будет использоваться для памяти удалителя, и не говорит, что этого не будет. Это не указано или я просто что-то упустил?

2
Является ли тип POD в точности эквивалентным тривиальному типу стандартной компоновки?
В C ++ 20 концепция POD устарела, предположительно потому, что это бессмысленная составная черта тривиальности и стандартной компоновки. Однако определение POD в проекте C ++ 20 не совсем «тривиально и стандартно»; это на самом деле: Класс POD - это класс, который является как тривиальным классом, так и классом стандартной компоновки …


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.