This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of New status.

4566. The element_type definition of scaled_accessor and conjugated_accessor are not quite right

Section: 29.9.8.2 [linalg.scaled.scaledaccessor], 29.9.9.2 [linalg.conj.conjugatedaccessor] Status: New Submitter: Hewill Kang Opened: 2026-04-08 Last modified: 2026-04-11

Priority: Not Prioritized

View all issues with New status.

Discussion:

The scaled_accessor defines element_type as const decltype(declval<ScalingFactor>() * ...), but its access returns (scaling_factor() * ...), where scaling_factor() returns const ScalingFactor&.

Furthermore, both scaled_accessor and conjugated_accessor's access construct NestedAccessor::element_type via nested-accessor.access(p, i), but this may not be well-formed.

Proposed resolution:

This wording is relative to N5032.

  1. Modify 29.9.8.2 [linalg.scaled.scaledaccessor] as indicated:

    namespace std::linalg {
      template<class ScalingFactor, class NestedAccessor>
      class scaled_accessor {
      public:
        using element_type =
          const decltype(declval<const ScalingFactor&>() * 
                         typename declval<NestedAccessor::element_type>(
                            declval<typename NestedAccessor::reference>()));
        […]
      };
    }
    
  2. Modify 29.9.9.2 [linalg.conj.conjugatedaccessor] as indicated:

    namespace std::linalg {
      template<class NestedAccessor>
      class scaled_accessor {
      public:
        using element_type =
          const decltype(conj-if-needed(
                           typename declval<NestedAccessor::element_type>(
                             declval<typename NestedAccessor::reference>())));
        […]
      };
    }