Compile time triggered range check for std::vector
If I'm not mistaken, this is the usual situation with Visual Studio. With g++, you have to invoke the compiler with -D_GLIBCXX_CONCEPT_CHECKS -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC
. (It's probable that you don't need all three, but I use all
three systematically.) With other compilers, check the documentation. The purpose of the undefined behavior in the standard here is precisely to allow this sort of thing.
Automatically check bounds in std::vector
To me, this utility template seems to be so straight-forward that I'd
expect it to exist
For gcc it does exist. gcc libstdc++ has a set of debug containers. For std::vector
it has __gnu_debug::vector
debug container. See documentation.
Convert between vector::operator[] and vector::at in C++
Like
If (DEBUG)
{
// Do with .at
}
else
{
// Do with []
}
You get something like this by using operator[]
and by enabling bounds checking debug mode of the standard library implementation that you use. How to do that, and whether that option exists depends on what implementation you use.
Note that typically the entire project, including all libraries must have been built with the same standard library options. This is a potential problem if you use pre-built libraries.
A universally portable solution is to write a wrapper function that conditionally calls one function or the other depending on build configuration. Downside is that this requires changing all code using the wrapped function to use the custom one.
C++ calculate and sort vector at compile time
A std::vector<int>
does not have any constexpr
constructors (because dynamic memory allocation is disallowed for constexpr
). So you can't sort a std::vector<int>
at compile-time.
You can create a std::array<int, N>
at compile-time for a constant N
, but you'd have to write your own sorting routine because std::sort
is not constexpr
either.
You can also write a Boost.MPL compile-time vector or list and use the sort
routine of that. But this won't scale as well as std::array
.
Another angle of attack might be to store the vector into a static
variable and do the sorting at program initialization. Your program just takes a bit longer to start, but it won't affect the rest of its main functionality.
Since sorting is O(N log N)
, you might even have a two-step build and write the sorted vector to a file, and either compile/link it to your main program, or load it in O(N)
at program startup into a static
variable.
Why does c++ for each loops accept r-values but std::ranges do not?
The for-loop works fine because the vector<int>
(rvalue) is valid while the loop is evaluated.
The second code snippet has 2 issues:
- The predicate must return a
bool
- the
vector<int>
you are using in the views object is dangling by the time it is evaluated, so the compiler does not accept it.
If instead of a vector<int>
rvalue, the object cannot dangle (lvalue) or holds references into something else that cannot not dangle, this would work.
For example:
auto vec = std::vector<int>({0, 1});
auto vw = vec | std::ranges::views::filter([](int i) { std::cout << i; return true; });
Or you can pass an rvalue that has references to a non-dangling vector<int>
object, like std::span
:
auto vec = std::vector<int>({0, 1});
auto vw = span{vec} | std::ranges::views::filter([](int i) { std::cout << i; return true; })
Here, std::span
is still a rvalue, but the compiler accepts it because the author of std::span
has created an exception for it.
For a custom type with references into something else (typically views), you can create your own exception by creating a specialization of the template variable enable_borrowed_range
.
In the case of vector it would look like this (but don't do this!):
template<> // don't do this
inline constexpr bool ranges::enable_borrowed_range<std::vector<int>> = true;
Your code now compiles but it will trigger undefined behavior because the vector is dangling once the view is evaluated.
Related Topics
Can the "Application Error" Dialog Box Be Disabled
"Symbol(S) Not Found for Architecture X86_64" on Qtcreator Project
Converting Epoch Time to "Real" Date/Time
Universal Less<> for Pointers in C++ Standard
Slot Is Being Called Multiple Times Every Time a Signal Is Emitted
C++ Inheritance and Function Overriding
How to Read and Write a Stl C++ String
Why Do Lambda Functions in C++11 Not Have Function<> Types
Complete C++ I18N Gettext() "Hello World" Example
In C++, How to Forward Declare a Class as Inheriting from Another Class
Exception Safety and Make_Unique
How Does a 32 Bit Processor Support 64 Bit Integers
How to Rely on the Reduce-Capacity Trick
How to Set a Breakpoint in Gdb That Is Conditional on the Call Stack