On Mon, Jan 13, 2020 at 7:15 PM Matthew Woehlke via Std-Proposals <std-proposals@lists.isocpp.org> wrote:
On 21/11/2019 05.33, Andrew Tomazos via Std-Proposals wrote:
> Please find attached a 2-page draft proposal entitled:
>
>      Proposal of constpub
>
> It seems a little thing but easy to implement and I think it may have broad
> appeal.
>
> Anyway, initial thoughts appreciated.
>     -Andrew.

I would rather see:

class foo
{
public:
  using x = std::as_const(m_x);
protected:
  int m_x;
}

No new keywords, leverages the idea of "universal aliases", has more
possible uses...

I agree, that it is better to have new type of alias/reference then to have a niche keyword, and that the price to have a diff name it is worth it,
 because, if we are to add an observer function, we have to use a different syntax anyway.

Few months back I played with that idea and figured out, a completely new reference can help us "restore" the "aggregate-ness" of  class, lost by adding a private member

Consider

class C
{
public:
  const auto x -> m_x; 

protected:
  int m_x;
}


C c{12}; //< works!
auto [x1] = c; //< works!
auto x2 = std::get<0>(c); //< works!

Also, we can reuse a struct, and rename files

struct Payload : std::pair<int, std::string>
{
  auto key -> first;
  auto value -> second;
}; 

The most interesting part is, that we have all the tools to implement this, 
as designators can simply be regular members, declared as [no_unique_address].

assert(std::addressof(c.x) == std::addressof(c.m_x)); 

Once we have a new members we can redefine operator& for them and get a bonus feature:

template<Func F>
void work(F f) { ... f(c); }

C c{12};

work(&C::x); //< creates function object with signature int(const C&)



--
Matthew
--
Std-Proposals mailing list
Std-Proposals@lists.isocpp.org
https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals