Запитання з тегом «c++»

C ++ - мова програмування загального призначення. Спочатку він був розроблений як розширення до C і має подібний синтаксис, але зараз це зовсім інша мова. Використовуйте цей тег для запитань про код (який потрібно) зібрати за допомогою компілятора C ++. Використовуйте тег, що стосується версії, для питань, пов’язаних із конкретною стандартною редакцією [C ++ 11], [C ++ 14], [C ++ 17] або [C ++ 20] тощо.

1
SFINAE, використовуючи VoidT з різними компіляторами, призводить до різних результатів
Розглянемо наступний код: template <typename T> using VoidT = void; class A { public: using TEST = int; }; class C { public: using DIFFERENT = int; }; template <typename T, typename Enable = void> class B { public: B() = delete; }; template <typename T> class B<T, VoidT<typename T::TEST>> …
10 c++ 

2
Що станеться, якщо невизначена поведінка C ++ відповідає поведінці, визначеній C?
У мене є *.cppфайл, який я компілюю за допомогою C ++ (не компілятор C). Функція, що містить, покладається на заголовок (див. Останній рядок), який, здається, визначений в C (будь ласка, виправте, якщо я помиляюся!), Але не в C ++ для цього спеціального типу. [...] C++ code [...] struct sockaddr_in sa …


2
Що гарантується C ++ std :: atomic на рівні програміста?
Я прослухав і прочитав декілька статей, бесід та запитань про поточний потік std::atomic, і хотів би бути впевненим, що я це добре зрозумів. Оскільки я все ще трохи заплутаний у кеш-рядку запису видимості через можливі затримки протоколів когерентності кеш-пам'яті MESI (або похідних), зберігання буферів, недійсних черг тощо. Я прочитав, що …

1
GCC не повідомляє про неправильно сформований лямбда-виклик constexpr
Нижче наведено два тестові випадки для невизначеної поведінки, виражених як IIFE (негайно називається лямбда-Axpression): constexpr auto test3 = []{ int* p{}; { int x{}; p = &x; } return *p; // Undefined Behaviour }(); // IIFE constexpr auto test4 = []{ int x = std::numeric_limits<int>::min(); int y = -x; // …

1
Перетворення в недійсні ** на різних компіляторах
Я використовував наступний код через різні компілятори: int main() { float **a; void **b; b = a; } З того, що я був в змозі зібрати, void **це НЕ загальний покажчик , який означає , що будь-яке перетворення з іншого покажчика не повинен становити принаймні , кинути попередження. Однак ось …
9 c++  c  cuda 

1
Яким чином shift_right () призначений для впровадження в C ++ 20?
У C ++ 20 <algorithm>заголовок отримує два нові алгоритми: shift_left()іshift_right() . Вони обидва приймають будь-якого LegacyForwardIterator. Бо shift_left()визначено, що "ходи виконуються у порядку зростання, iпочинаючи з ​0"; для shift_right(), зазначено, що "якщо ForwardItвідповідає вимогам LegacyBidirectionalIterator, то переміщення виконуються у порядку зменшення, iпочинаючи з last - first - n - 1". …

1
Передача покажчика функції з масиву функціональних покажчиків як аргумент шаблону
Я хотів би передати покажчик функції з масиву вказівників функції як аргумент шаблону. Мій код, здається, компілюється за допомогою MSVC, хоча Intellisense скаржиться, що щось не так. І gcc, і clang не можуть зібрати код. Розглянемо наступний приклад: static void test() {} using FunctionPointer = void(*)(); static constexpr FunctionPointer functions[] …
9 c++  templates  c++14 

3
unique_ptr <0 АБО що робить менше, ніж оператор?
Я маю справу з кодом, написаним не мною. Я маю таке твердження: // p is type of std::unique_ptr&lt;uint8_t[]&gt; if (p &lt; 0) { /* throw an exception */ } То що p &lt; 0означає в цьому контексті? На сторінці документації я вважаю, що моя справа є 16) y &lt; nullptr, …

1
невідповідність кланг / гкц у спеціалізації класу
Я зіткнувся з цим питанням, намагаючись спеціалізуватися tuple_size/ tuple_elementдля спеціального класу на C ++ 17 для структурованого прив’язки. Нижче код компілюється в GCC, але не в clang (обидві версії магістралі, див. Посилання нижче). #include &lt;type_traits&gt; template&lt;typename T, typename... Ts&gt; using sfinae_t = T; template&lt;typename T, bool... Bs&gt; using sfinae_v_t = …

2
Варіація на тему вибору типу: тривіальна побудова на місці
Я знаю, що це досить поширена тема, але наскільки типовий UB легко знайти, я ще не знайшов цього варіанту. Отже, я намагаюся формально ввести об'єкти Pixel, уникаючи фактичної копії даних. Чи дійсно це? struct Pixel { uint8_t red; uint8_t green; uint8_t blue; uint8_t alpha; }; static_assert(std::is_trivial_v&lt;Pixel&gt;); Pixel* promote(std::byte* data, std::size_t …

5
Як повернути правильний тип даних у шаблони?
#include &lt;iostream&gt; using namespace std; template &lt;class X, class Y&gt; Y big(X a, Y b) { if (a &gt; b) return (a); else return (b); } int main() { cout &lt;&lt; big(32.8, 9); } Тут я використовую шаблони в CPP, тому коли я викликаю функцію в bigобхід аргументів doubleі intвведення, …

1
Чи є нова (ця) ця класифікація () поганою ідеєю?
class FooView final : public Something { ... void refresh() { this-&gt;~FooView(); new (this) FooView(); } } Я ніколи не бачив цієї ідіоми, і мені здається, що вона може бути справді тонкою і безладною, але насправді я не можу думати про проблему з цим (доки FooViewвона остаточна). Це погана ідея?

4
Сховати порожній базовий клас для сукупної ініціалізації
Розглянемо наступний код: struct A { // No data members //... }; template&lt;typename T, size_t N&gt; struct B : A { T data[N]; } Ось так потрібно ініціалізувати B: B&lt;int, 3&gt; b = { {}, {1, 2, 3} }; Я хочу уникнути зайвого порожнього {} для базового класу. Існує рішення …

1
Порівнюючи std :: string та літеральні рядки в стилі C
Припустимо, у мене є такий код: #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;iomanip&gt; using namespace std; // or std:: int main() { string s1{ "Apple" }; cout &lt;&lt; boolalpha; cout &lt;&lt; (s1 == "Apple") &lt;&lt; endl; //true } Моє запитання: як система перевіряє між цими двома? s1є об'єктом , а "Apple"являє …

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.