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

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

3
Вызов функции с указателем на неконстантный и указатель на константные аргументы с тем же адресом
Я хочу написать функцию, которая вводит массив данных и выводит другой массив данных, используя указатели. Мне интересно, каков результат, если оба srcи dstуказали на один и тот же адрес, потому что я знаю, что компилятор может оптимизировать для const. Это неопределенное поведение? (Я отметил теги C и C ++, потому …

1
Почему GCC не может предположить, что std :: vector :: size не изменится в этом цикле?
Я обратился к коллеге, который if (i < input.size() - 1) print(0);будет оптимизирован в этом цикле, чтобы input.size()он не читался на каждой итерации, но оказалось, что это не так! void print(int x) { std::cout << x << std::endl; } void print_list(const std::vector<int>& input) { int i = 0; for (size_t …
14 c++  gcc  assembly 

1
Можно ли инициализировать список std :: vector с идеальной пересылкой элементов?
Я заметил , что совокупный список инициализационных ЗПП :: вектор выполняет копирование инициализации , когда движение более применимо. В то же время, несколько emplace_backs делают то, что я хочу. Я мог только придумать это несовершенное решение написания шаблонной функции init_emplace_vector. Впрочем, это оптимально только для неявных однозначных конструкторов. template <typename …

1
Почему оптимизация пустой базы запрещена, если пустой базовый класс также является переменной-членом?
Оптимизация пустой базы - это здорово. Тем не менее, он имеет следующие ограничения: Оптимизация пустой базы запрещена, если один из пустых базовых классов также является типом или базой типа первого не статического члена данных, поскольку два базовых подобъекта одного типа должны иметь разные адреса в представлении объекта. самого производного типа. …

1
Почему стековая память выделяется, когда она не используется?
Рассмотрим следующий пример: struct vector { int size() const; bool empty() const; }; bool vector::empty() const { return size() == 0; } Сгенерированный код сборки для vector::empty(по clang, с оптимизацией): push rax call vector::size() const test eax, eax sete al pop rcx ret Почему он выделяет пространство стека? Это не …

1
Является ли разница между двумя экземплярами constexpr указателей __func__ все еще constexpr?
Это действительный C ++? int main() { constexpr auto sz = __func__ - __func__; return sz; } GCC и MSVC считают, что все в порядке, Clang считает, что это не так: Compiler Explorer . Все компиляторы соглашаются, что с этим все в порядке: Compiler Explorer . int main() { constexpr …

2
Как работают метания и ловли?
С этим кодом: int main() { try { throw -1; } catch (int& x) { std::cerr << "We caught an int exception with value: " << x << std::endl; } std::cout << "Continuing on our merry way." << std::endl; return 0; } У нас есть: /tmp$ ./prorgam.out Continuing on our …

1
если constexpr - почему отвергнутая выписка полностью проверена?
Я возился с C ++ 20 Conteval в GCC 10 и написал этот код #include <optional> #include <tuple> #include <iostream> template <std::size_t N, typename Predicate, typename Tuple> consteval std::optional<std::size_t> find_if_impl(Predicate&& pred, Tuple&& t) noexcept { constexpr std::size_t I = std::tuple_size_v<std::decay_t<decltype(t)>> - N; if constexpr (N == 0u) { return std::nullopt; …

1
Это ошибка в std :: gcd?
Я сталкивался с таким поведением, std::gcdкоторое я нашел неожиданным: #include <iostream> #include <numeric> int main() { int a = -120; unsigned b = 10; //both a and b are representable in type C using C = std::common_type<decltype(a), decltype(b)>::type; C ca = std::abs(a); C cb = b; std::cout << a << …

5
Как сделать групповую или парную складку пакета параметров?
template<class Msg, class... Args> std::wstring descf(Msg, Args&&... args) { std::wostringstream woss; owss << Msg << ". " << ... << " " << args << ": '" << args << "' ";//not legal at all //or owss << Msg << ". " << args[0] << ": '" << args[1] << …

2
Почему мы не можем создавать тривиально конструируемые объекты, используя malloc, если тривиальный конструктор по умолчанию не выполняет никаких действий?
Мне трудно понять следующий абзац, цитируемый из cppreference о тривиальном конструкторе по умолчанию. Я искал stackoverflow, но все еще не получил четкого ответа. Поэтому, пожалуйста, помогите. Тривиальный конструктор по умолчанию - это конструктор, который не выполняет никаких действий. Все типы данных, совместимые с языком C (типы POD), легко конструируются по …

2
копировать и перемещать конструкторы автоматически друзья?
Мы можем получить доступ к закрытым переменным другого класса, когда определяем конструкторы копирования или перемещения. С ++ делает их friendдруг другу автоматически? Например: my_str::my_str(my_str&& m) { size_ = m.size_; //accessing private variable another my_str class buff_ = m.buff_; //accessing private variable another my_str class m.buff_ = nullptr; m.size_ = 0; …
14 c++  friend-class 

3
Почему размерность массива является частью его типа?
Читая книгу по C ++ Primer, я натолкнулся на следующее утверждение: «Количество элементов в массиве является частью типа массива». Поэтому я хотел узнать, используя следующий код: #include<iostream> int main() { char Array1[]{'H', 'e', 'l', 'p'}; char Array2[]{'P', 'l', 'e', 'a', 's', 'e'}; std::cout<<typeid(Array1).name()<<std::endl; //prints A4_c std::cout<<typeid(Array2).name()<<std::endl; //prints A6_c return 0; …
14 c++  arrays  c++11 

3
Почему «++ i ++» недействителен, в то время как (++ i) ++ допустим?
Давайте рассмотрим следующий код: int main() { int i = 2; int b = ++i++; return 3; } Он компилирует следующее с ошибкой: <source>: In function 'int main()': <source>:3:16: error: lvalue required as increment operand 3 | int b = ++i++; | ^~ Это звучит справедливо для меня. Приращение постфикса …

3
Требуется ли когда-либо полностью определенное имя класса до глобальной области видимости для внешних определений функций-членов?
Этот вопрос заставил меня задуматься о том, когда-либо полезно / необходимо полностью квалифицировать имена классов (включая оператор глобальной области видимости) в определении функции-члена вне класса. С одной стороны, я никогда не видел, чтобы это было сделано раньше (и синтаксис для правильной работы кажется неясным). С другой стороны, поиск имени в …

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