0

C++ Alternative Operators

 1 year ago
source link: https://www.cedricmartens.com/articles/alt_ops
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

C++ Alternative OperatorsHome

Cursed C++: Alternative Operators

C++ alternative operators is a legacy feature that truly makes any codebase cursed.

%:include <iostream>

struct A <%
    A(int bitand a) : a(a) {}
    int bitand a;
%>;


int main(int argc, char**argv)
<%
    if(argc not_eq 2) <% return 1;%>

    int n = std::atoi(argv<:1:>);
    A a(n);

    auto func = <:bitand:>(A a)<%
        std::cout << a.a << std::endl;
    %>;

    func(a);
    return 0;
%>

You might not believe it, but this code compiles and prints the integer provided as an argument.

List of alternative operators

This is the list of alternative operators in C++.

PrimaryAlternative
&&and
&=and_eq
&bitand
|bitor
~compl
!not
!=not_eq
||or
|=or_eq
^xor
^=xor_eq
{<%
}%>
[<:
]:>
#%:
##%:%:

The most notable one is bitand which can hilariously be used to indicate a reference as shown in the example above.

What are these for?

C source code must be compatible with the ISO 646 invariant character set. This non-ascii character set was developed as a base for international 7-bit variant character sets. Due to C++ backwards compatibility with C, these alternative operators are also in C++ today.

ISO 646 invariant structure

The invariant character set has 34 control codes (characters such as NUL and DEL) and 82 non-control characters.



Here are the 82 non-control characters: !"%&'()*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz

You might notice that these characters {}[] are missing. This is why alternative operators were added in C.



The invariant leaves 12 characters for international variants.

As an example of international use, this is how the french-canadian variant used its 12 spare characters: #$àâçêîôéùèû.



It is a bit mysterious why & needs an alternate operator when it is in the invariant. It appears that some international variants went beyond the 12 characters and replaced other characters like !. I could not find a specific variant replacing & but the ! character is supported with the not keyword in C++, leading me to believe that & is supported because there's a variant not using it.

Questions? Comments? Insults? Send me an email! moc.snetramcirdec@cirdec

Created: 2022-11-26 - Last Edited: 2022-11-26

Please consider joining the mailing list to receive an email when a new article is posted. 😎

Email

The average cedricmartens.com mailing list subscriber.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK