Comments (7)
Subclassing std::vector<int*>
and converting to span<const int* const>
seems to work correctly in a quick test:
https://gcc.godbolt.org/z/Y68boPvYo
Are you able to give any more information about the error message that might help me recreate the problem, or perhaps try with another compiler?
from span.
I was trying to reproduce it w/ something closer to my code, but it was still working, but when I switched to MSVC even the std::vector case broke! (maybe I got confused earlier about it working)
See https://gcc.godbolt.org/z/e3q5e4PW5
It looks like it doesn't like it when it needs to add const?
from span.
I think the problem boils down to this:
#include <type_traits>
static_assert(std::is_convertible<int* (*)[], const int* const (*)[]>::value, "");
int main() {}
On compiler explorer, this compiles fine with:
- x64 MSVC 19.14 with
/std:c++17
- GCC >= 10.1 with
-std:c++11
- clang >= 7.0.0 with
-std:c++11
This does not compile with x64 MSVC 19.14 with /std:c++14
nor with older GCC or clang.
If we remove the first const
, it compile everywhere.
from span.
Thank you very much for the detective work @kimci86!
After some more investigation, this seems to be caused by CWG issue 330, which was reported in 2002 and finally resolved via N4261 in 2014.
So that's the cause, but unfortunately there are no simple solutions that I can think of.
The condition that's being checked -- can we convert a pointer-to-array-of-U into a pointer-to-array-of-T -- is directly lifted from the std::span
specification, and I'm very reluctant to change it as it what prevents, for example, instantiating a span<Base>
from an array of Derived
.
Unless anyone has any clever ideas, I'm afraid that this may just be something that we have to say is unsupported in older compilers.
(Note that gsl::span
uses the exact same check and so I guess it has precisely the same issue.)
from span.
Wouldn't it be possible to 'wrap' std::is_convertible
in something which handles this case by first removing all the const
s from the type? IMO it would make sense to try & make this work for older compilers since this library is meant to support older C++ standards?
from span.
The goal is to provide span
for older compilers to the extent supported by the language. If the core language is telling us that it doesn't think the pointers are convertible, well, we probably shouldn't do the conversion.
from span.
Related Issues (20)
- Does not compile with span of bool type HOT 7
- span.hpp should include <iterator> and <tuple> HOT 3
- Allow usage as submodule HOT 2
- p1872r0 has not been implemented (replacing index_type with size_type) HOT 3
- Update constructors HOT 1
- Add versioning info in-source and in git HOT 3
- Latest C++20 draft has no cbegin/cend/crbegin/crend (anymore) HOT 1
- Linking problems with multiple translation units HOT 1
- header pollution HOT 6
- Release HOT 2
- TCB_SPAN_THROW_ON_CONTRACT_VIOLATION makes this implementation non-conforming according to C++20 HOT 2
- Add .natvis file
- Compilation error caused by data() member HOT 11
- Cannot construct from std::array of const values HOT 1
- span type missing const_iterator member type HOT 1
- Compilation error when trying to emplace spans in a vector (while STL span works fine) HOT 1
- MINSIGSTKSZ cannot be used for constexpr variable HOT 2
- Can tcb::span be forward-declared safely?
- ‘terminate’ is not a member of ‘std’ HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from span.