Date: Fri, 23 Feb 2024 14:34:30 +0100
{"mangled(std::mutex)"} expands to "St5mutex"
-> this changes, how curly braces or how strings are interpreted! And that you can resolve expressions (e.g. decltype and its parameter) within strings.
-> In which translation phase should the expansion be done?
The _ZTV prefix is ABI specific (so are virtual tables). Why standardize the {mangled}, if the further usage of the mangled name is implementation-specific anyway?
-----Ursprüngliche Nachricht-----
Von:Frederick Virchanza Gotham via Std-Proposals <std-proposals_at_[hidden]>
Gesendet:Fr 23.02.2024 14:11
Betreff:[std-proposals] operator mangled
An:std-proposals <std-proposals_at_[hidden]>;
CC:Frederick Virchanza Gotham <cauldwell.thomas_at_[hidden]>;
Imagine if C++ had a new operator called '{mangled}', which sits just
above 'sizeof' on the operator precedence table, which must be
followed by a type in parentheses, for example:
{mangled(std::mutex)} expands to St5mutex
{"mangled(std::mutex)"} expands to "St5mutex"
The latter behaves exactly like a string literal, such that you can do:
std::stringstream ss;
char const *str = "_ZTV" {"mangled(decltype(ss))"};
and it's as if you wrote:
std::stringstream ss;
char const *str = "_ZTV"
"NSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEE";
which of course is the same as:
std::stringstream ss;
char const *str =
"_ZTVNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEE";
What would make it more interesting though is if we could use it with
'extern' as follows:
#include <sstream>
int main(void)
{
std::stringstream ss;
// On the next line, we declare the mangled name of the vtable
extern void (*_ZTV{mangled(decltype(ss))})(void);
// On the next line, we get the address of the vtable
void (**vtable)(void*) = &_ZTV{mangled(decltype(ss))};
vtable[0](&ss); // Invoke the destructor
::new(&ss) std::stringstream(); // Invoke the constructor
}
--
Std-Proposals mailing list
Std-Proposals_at_[hidden]
https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals
Received on 2024-02-23 13:34:32