[ ranges::  range_value_t
](http://en.cppreference.com/w/cpp/ranges/iterator_t) < C  >> is  true  :

1)  Constructing a non-view object as if [ direct-initializing
](/w/cpp/language/direct_initialization "cpp/language/direct initialization")
(but not direct-list-initializing) an object of type ` C ` from the source
range  [ std::  forward  ](http://en.cppreference.com/w/cpp/utility/forward) <
R  > (  r  )  and the rest of the functional arguments  [ std::  forward
](http://en.cppreference.com/w/cpp/utility/forward) < Args  > (  args  )  ...
if  [ std::  constructible_from
](http://en.cppreference.com/w/cpp/concepts/constructible_from) < C, R,
Args...  > is  true  .

2)  Otherwise, constructing a non-view object as if [ direct-initializing
](/w/cpp/language/direct_initialization "cpp/language/direct initialization")
(but not direct-list-initializing) an object of type ` C ` from additional
disambiguation tag  [ std::  from_range
](http://en.cppreference.com/w/cpp/ranges/from_range) , the source range  [
std::  forward  ](http://en.cppreference.com/w/cpp/utility/forward) < R  > (
r  )  and the rest of the functional arguments  [ std::  forward
](http://en.cppreference.com/w/cpp/utility/forward) < Args  > (  args  )  ...
if  [ std::  constructible_from
](http://en.cppreference.com/w/cpp/concepts/constructible_from) < C, [ std::
from_range_t  ](http://en.cppreference.com/w/cpp/ranges/from_range) , R,
Args...  > is  true  .

3)  Otherwise, constructing a non-view object as if [ direct-initializing
](/w/cpp/language/direct_initialization "cpp/language/direct initialization")
(but not direct-list-initializing) an object of type ` C ` from the iterator-
sentinel pair (  [ ranges::  begin  ](http://en.cppreference.com/w/cpp/ranges-
ranges-placeholder/begin) (  r  )  as an iterator and  [ ranges::  end
](http://en.cppreference.com/w/cpp/ranges-ranges-placeholder/end) (  r  )  as
sentinel, where iterator and sentinel have the same type. In other words, the
source range must be a common range), and the rest of function arguments  [
std::  forward  ](http://en.cppreference.com/w/cpp/utility/forward) < Args  >
(  args  )  ...  if all of the conditions below are  true  :

  * [ ranges::  common_range  ](http://en.cppreference.com/w/cpp/ranges/common_range) < R  >
  * If  [ std::  iterator_traits  ](http://en.cppreference.com/w/cpp/iterator/iterator_traits) < [ ranges::  iterator_t  ](http://en.cppreference.com/w/cpp/ranges-ranges-placeholder/iterator_t) < R  >> ::  iterator_category  is valid and denotes a type that satisfies  [ std::  derived_from  ](http://en.cppreference.com/w/cpp/concepts/derived_from) < [ std::  input_iterator_tag  ](http://en.cppreference.com/w/cpp/iterator/iterator_tags) >
  * [ std::  constructible_from  ](http://en.cppreference.com/w/cpp/concepts/constructible_from) < C, [ ranges::  iterator_t  ](http://en.cppreference.com/w/cpp/ranges-ranges-placeholder/iterator_t) < R  > , [ ranges::  sentinel_t  ](http://en.cppreference.com/w/cpp/ranges-ranges-placeholder/iterator_t) < R  > , Args...  >

4)  Otherwise, constructing a non-view range object as if [ direct-
initializing ](/w/cpp/language/direct_initialization "cpp/language/direct
initialization") (but not direct-list-initializing) an object of type ` C `
from the rest of the function arguments  [ std::  forward
](http://en.cppreference.com/w/cpp/utility/forward) < Args  > (  args  )  ...
with the following equivalent call below after the construction:

if  constexpr  (  [ ranges::  sized_range
](http://en.cppreference.com/w/cpp/ranges/sized_range) < R  > && /*reservable-
container*/  < C  > )  
c.  reserve  (  static_cast  < [ ranges::  range_size_t
](http://en.cppreference.com/w/cpp/ranges/iterator_t) < C  >> (  [ ranges::
size  ](http://en.cppreference.com/w/cpp/ranges/size) (  r  )  )  )  ;  
[ ranges::  for_each
](http://en.cppreference.com/w/cpp/algorithm/ranges/for_each) (  r,
/*container-appender*/  (  c  )  )  ;  
If the ` R ` satisfies [ ` sized_range ` ](