brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.7 KiB · 70ab855 Raw
58 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++14, c++17, c++2010 11// std::ranges::as_rvalue_view::as_rvalue_view(...)12 13#include <cassert>14#include <ranges>15#include <type_traits>16#include <utility>17#include <vector>18 19struct DefaultConstructibleView : std::ranges::view_base {20  int* begin() const;21  int* end() const;22 23  int i_ = 23;24};25 26struct NonDefaultConstructibleView : std::ranges::view_base {27  NonDefaultConstructibleView(int i) : i_(i) {}28 29  int* begin() const;30  int* end() const;31 32  int i_ = 23;33};34 35static_assert(!std::is_constructible_v<std::ranges::as_rvalue_view<NonDefaultConstructibleView>>);36static_assert(std::is_constructible_v<std::ranges::as_rvalue_view<NonDefaultConstructibleView>, int>);37static_assert(std::is_nothrow_constructible_v<std::ranges::as_rvalue_view<DefaultConstructibleView>>);38 39template <class T, class... Args>40concept IsImplicitlyConstructible = requires(T val, Args... args) { val = {std::forward<Args>(args)...}; };41 42static_assert(IsImplicitlyConstructible<std::ranges::as_rvalue_view<DefaultConstructibleView>>);43static_assert(!IsImplicitlyConstructible<std::ranges::as_rvalue_view<NonDefaultConstructibleView>, int>);44 45constexpr bool test() {46  std::ranges::as_rvalue_view<DefaultConstructibleView> view = {};47  assert(view.base().i_ == 23);48 49  return true;50}51 52int main(int, char**) {53  static_assert(test());54  test();55 56  return 0;57}58