Giter Site home page Giter Site logo

Comments (7)

tcbrindle avatar tcbrindle commented on June 9, 2024

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.

matthew-wozniczka avatar matthew-wozniczka commented on June 9, 2024

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.

kimci86 avatar kimci86 commented on June 9, 2024

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.

tcbrindle avatar tcbrindle commented on June 9, 2024

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.

matthew-wozniczka avatar matthew-wozniczka commented on June 9, 2024

Wouldn't it be possible to 'wrap' std::is_convertible in something which handles this case by first removing all the consts 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.

tcbrindle avatar tcbrindle commented on June 9, 2024

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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.