Beispielprogramme zu C++
main.c
#include <initializer_list>
#include <iostream>
#include <ostream>
#include <string>
#include <vector> using namespace ::std::literals; struct sigma
{ sigma( ::std::string const s ): x{ 1 }{}
sigma( ::std::initializer_list<::std::string> const s ): x{ 2 }{}
operator bool(){ return false; }
int x; };
sigma f( sigma x ){ return { "a"s, "b"s }; }
void try_out_sigma()
{ sigma s{ "abc"s }; ::std::cout << s.x << '\n';
s = "abc"s; ::std::cout << s.x << '\n';
s ={ "abc"s }; ::std::cout << s.x << '\n';
s ={ "a"s, "b"s }; ::std::cout << s.x << '\n';
f( { "a"s, "b"s } );
sigma t = sigma{ "a"s, "b"s }; ::std::cout << t.x << '\n';
/* sigma u = static_cast< sigma >( { "a"s, "b"s }); *//* No! */
sigma u = static_cast< sigma >( "a"s );
::std::vector< sigma >v;
v.emplace_back( "a"s );
/* v.emplace_back( { "a"s, "b"s } ); *//* No! Why? */
if( s ){}
if( sigma{ "a"s, "b"s } ){}
if( sigma t = "abc"s ){}
if( sigma t{ "a"s, "b"s } ){}
::std::cout << "done.\n"s; }
struct eta
{ explicit eta( ::std::string const s ): x{ 1 }{}
explicit eta( ::std::initializer_list<::std::string> const s ): x{ 2 }{}
explicit operator bool(){ return false; }
int x; };
void f( eta x ){ return; /* return { "a"s, "b"s }; */ /* No, explict! */ }
void try_out_eta()
{ eta s{ "abc"s }; ::std::cout << s.x << '\n'; /* still ok */
/* s = "abc"s; ::std::cout << s.x << '\n'; */ /* No, explict! */
/* s ={ "abc"s }; ::std::cout << s.x << '\n'; */ /* No, explict! */
/* s ={ "a"s, "b"s }; ::std::cout << s.x << '\n'; */ /* No, explict! */
/* f( { "a"s, "b"s } ); */ /* No, explict! */
eta t = eta{ "a"s, "b"s }; ::std::cout << t.x << '\n'; /* still ok */
eta u = static_cast< eta >( "a"s ); /* still ok */
::std::cout << u.x << '\n';
::std::vector< eta >v;
v.emplace_back( "a"s ); /* still ok */
if( s ){} /* still ok! Why? */
if( eta{ "a"s, "b"s } ){}
/* if( eta t = "abc"s ){} *//* No, explict! */
if( eta t{ "a"s, "b"s } ){} /* still ok */
::std::cout << "done.\n"s; }
int main()
{ try_out_sigma();
try_out_eta(); }