В чем принципиальное отличие ссылки от указателя в С++? Какие ограничения есть у первых, а какие у вторых?
Вот некоторые из отличий::
nullptr
:void f(int* num, int& num2)
{
if(num != nullptr) // if nullptr ignored algorithm
{
}
// can't check num2 on need to use or not
}
const
#include <iostream>
int main()
{
std::cout << "Hello, world!\n";
const int v = 10;
//int& const r = v; // Ошибка
const int& r = v;
enum
{
is_const = std::is_const<decltype(r)>::value
};
if(!is_const)
std::cout << "const int& r is not const\n";
else
std::cout << "const int& r is const\n";
}
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤3🔥2⚡1
#include <iostream>
#include <vector>
int main() {
std::vector<int> a{0,1,2,3,4,5};
int b = 0;
std::cout << a[b + 1] << std::endl; // подчеркивает 'b+1'
return 0;
}
возникает проблема:
Арифметическое переполнение: использование оператора "+" на байтовом значении 4 и приведение результата к байтовому значению 8. Приведите значение к более широкому типу перед вызовом оператора "+", чтобы избежать переполнения (io.2)
Почему возникает такое предупреждение?
b+1
имеет тип int
. Если предположить, что в b
будет максимальное значение, представимое типом int
, то получим UB. Решение: привести хотя бы один из операндов к 64-битному типу.
В общем, компилятор ругается здесь не на конкретные значения, а на типы, используемые в выражении.
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13⚡3🔥2❤1