Skip to content

<ranges>: repeat_view's deduction guide doesn't handle 1 argument #3576

Description

Found by David Hunter (@davidhunter22), analyzed by me, suggested fix by Casey Carter (@CaseyCarter). We need to file an LWG issue with this proposed resolution.

WG21-N4928 [range.repeat.view] depicts repeat_view's constructors:

    constexpr explicit repeat_view(const T& value, Bound bound = Bound())
      requires copy_­constructible<T>;
    constexpr explicit repeat_view(T&& value, Bound bound = Bound());

and a deduction guide:

  template<class T, class Bound>
    repeat_view(T, Bound) -> repeat_view<T, Bound>;

This doesn't provide a deduction guide for 1 argument, even though the constructors can handle that.

Casey's suggested fix, slightly modified by me to match the Standardese instead of our implementation:

  template<class T, class Bound = unreachable_sentinel_t>
    repeat_view(T, Bound = Bound()) -> repeat_view<T, Bound>;

Full test case:

C:\Temp>type meow.cpp
#include <iostream>
#include <ranges>

int main() {
    for (const auto& e : std::ranges::repeat_view("Hello", 2)) {
        std::cout << e << "\n";
    }
#ifdef USE_ONE_ARG
    // std::views::repeat also fails to compile. While it's more desirable in general,
    // std::ranges::repeat_view gives a clearer error message for this issue.
    for (const auto& e : std::ranges::repeat_view("Hello")) {
        std::cout << e << "\n";
    }
#endif
}
C:\Temp>cl /EHsc /nologo /W4 /MT /Od /std:c++latest meow.cpp && meow
meow.cpp
Hello
Hello

C:\Temp>cl /EHsc /nologo /W4 /MT /Od /std:c++latest /DUSE_ONE_ARG meow.cpp && meow
meow.cpp
meow.cpp(11): error C2641: cannot deduce template arguments for 'std::ranges::repeat_view'
meow.cpp(11): error C2893: Failed to specialize function template 'std::ranges::repeat_view<_Ty,_Bo> std::ranges::repeat_view(const _Ty &,_Bo) noexcept(<expr>)'
C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.36.32502\include\ranges(1543): note: see declaration of 'std::ranges::repeat_view'
meow.cpp(11): note: With the following template arguments:
meow.cpp(11): note: '_Ty=char [6]'
meow.cpp(11): note: '_Bo=std::unreachable_sentinel_t'
meow.cpp(11): error C2780: 'std::ranges::repeat_view<_Ty,_Bo> std::ranges::repeat_view(void)': expects 0 arguments - 1 provided
C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.36.32502\include\ranges(1540): note: see declaration of 'std::ranges::repeat_view'
meow.cpp(11): error C2780: 'std::ranges::repeat_view<_Ty,_Bo> std::ranges::repeat_view(_Tuple &,std::integer_sequence<size_t,_Indices...>,_Bo) noexcept(<expr>)': expects 3 arguments - 1 provided
C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.36.32502\include\ranges(1534): note: see declaration of 'std::ranges::repeat_view'
meow.cpp(11): error C2784: 'std::ranges::repeat_view<_Ty,_Bo> std::ranges::repeat_view(std::ranges::repeat_view<_Ty,_Bo>)': could not deduce template argument for 'std::ranges::repeat_view<_Ty,_Bo>' from 'const char [6]'
C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.36.32502\include\ranges(1395): note: see declaration of 'std::ranges::repeat_view'
meow.cpp(11): error C2530: 'e': references must be initialized
meow.cpp(11): error C3531: 'e': a symbol whose type contains 'auto' must have an initializer
meow.cpp(11): error C2143: syntax error: missing ';' before ':'
meow.cpp(11): error C2641: cannot deduce template arguments for 'std::ranges::repeat_view'
meow.cpp(11): error C2893: Failed to specialize function template 'std::ranges::repeat_view<_Ty,_Bo> std::ranges::repeat_view(const _Ty &,_Bo) noexcept(<expr>)'
C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.36.32502\include\ranges(1543): note: see declaration of 'std::ranges::repeat_view'
meow.cpp(11): note: With the following template arguments:
meow.cpp(11): note: '_Ty=char [6]'
meow.cpp(11): note: '_Bo=std::unreachable_sentinel_t'
meow.cpp(11): error C2780: 'std::ranges::repeat_view<_Ty,_Bo> std::ranges::repeat_view(void)': expects 0 arguments - 1 provided
C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.36.32502\include\ranges(1540): note: see declaration of 'std::ranges::repeat_view'
meow.cpp(11): error C2780: 'std::ranges::repeat_view<_Ty,_Bo> std::ranges::repeat_view(_Tuple &,std::integer_sequence<size_t,_Indices...>,_Bo) noexcept(<expr>)': expects 3 arguments - 1 provided
C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.36.32502\include\ranges(1534): note: see declaration of 'std::ranges::repeat_view'
meow.cpp(11): error C2784: 'std::ranges::repeat_view<_Ty,_Bo> std::ranges::repeat_view(std::ranges::repeat_view<_Ty,_Bo>)': could not deduce template argument for 'std::ranges::repeat_view<_Ty,_Bo>' from 'const char [6]'
C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.36.32502\include\ranges(1395): note: see declaration of 'std::ranges::repeat_view'
meow.cpp(11): error C2143: syntax error: missing ';' before ')'

C:\Temp>clang-cl /EHsc /nologo /W4 /MT /Od /std:c++latest /DUSE_ONE_ARG meow.cpp && meow
meow.cpp(11,26): error: no viable constructor or deduction guide for deduction of template arguments of 'repeat_view'
    for (const auto& e : std::ranges::repeat_view("Hello")) {
                         ^
C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.36.32502\include\ranges(1543,44): note:
      candidate template ignored: substitution failure [with _Ty = char[6], _Bo = std::unreachable_sentinel_t]:
      constraints not satisfied for class template 'repeat_view' [with _Ty = char[6], _Bo = std::unreachable_sentinel_t]
        _NODISCARD_CTOR constexpr explicit repeat_view(const _Ty& _Value_, _Bo _Bound_ = _Bo{}) noexcept(
                                           ^
C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.36.32502\include\ranges(1553,44): note:
      candidate template ignored: substitution failure [with _Ty = const char[6], _Bo = std::unreachable_sentinel_t]:
      constraints not satisfied for class template 'repeat_view' [with _Ty = const char[6], _Bo =
      std::unreachable_sentinel_t]
        _NODISCARD_CTOR constexpr explicit repeat_view(_Ty&& _Value_, _Bo _Bound_ = _Bo{}) noexcept(
                                           ^
C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.36.32502\include\ranges(1395,11): note:
      candidate template ignored: could not match 'repeat_view<_Ty, _Bo>' against 'const char *'
    class repeat_view : public view_interface<repeat_view<_Ty, _Bo>> {
          ^
C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.36.32502\include\ranges(1540,9): note: candidate
      function template not viable: requires 0 arguments, but 1 was provided
        repeat_view() requires default_initializable<_Ty> = default;
        ^
C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.36.32502\include\ranges(1591,5): note: candidate
      function template not viable: requires 2 arguments, but 1 was provided
    repeat_view(_Ty, _Bo) -> repeat_view<_Ty, _Bo>;
    ^
C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.36.32502\include\ranges(1534,35): note:
      candidate function template not viable: requires 3 arguments, but 1 was provided
        _NODISCARD_CTOR constexpr repeat_view(_Tuple& _Val, index_sequence<_Indices...>, _Bo _Bound_) noexcept(
                                  ^
C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.36.32502\include\ranges(1565,44): note:
      candidate function template not viable: requires at least 2 arguments, but 1 was provided
        _NODISCARD_CTOR constexpr explicit repeat_view(piecewise_construct_t,
                                           ^
1 error generated.

Activity

  1. frederick-vs-ja commented on Feb 10, 2024

    @frederick-vs-ja
    Contributor

    LWG-4053 opened.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    LWG issue neededA wording defect that should be submitted to LWG as a new issuerangesC++20/23 rangesresolvedSuccessfully resolved without a commit

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions