Conversion - C++11, 18 of n

1) Conversion Constructor

struct X {
    X(int);
    X(const char*, int =0);
    X(int, int);
};

void f(X arg) {
    X a = 1; // a)
    X b = "Jessie";  // b)
    a = 2; // a = X(2)
    f(3); // f(X(3))
    f({1, 2}); // f(X(1,2))  # C++11
}

a) If "-fno-elide-constructor" is specified when compiling, it constructs a temp X(1) first, and then copy construct left hand "a". By default the compile will optimize out the temp object.
b) If "-fno-elide-constructor" is specified when compiling, it constructs a temp X("Jessie",0) first, and then copy construct left hand "b".
So best practice is constructing object in the form of "X a(1) (direct initialization)" instead of "X a = 1 (copy initialization)" or make the constructor "explicit"


An explicit constructor constructs objects just like non-explicit constructors, but does so only where the direct-initialization syntax or where casts are explicitly used.

struct Z {
    explicit Z();
    explicit Z(int);
    explicit Z(int, int);
};

Z a; // OK: default-initialization performed
Z a1 = 1; // error: no implicit conversion
Z a3 = Z(1); // OK: direct initialization syntax used
Z a2(1); // OK: direct initialization syntax used
Z* p = new Z(1); // OK: direct initialization syntax used
Z a4 = (Z)1; // OK: explicit cast used
Z a5 = static_cast<Z>(1); // OK: explicit cast used
Z a6 = { 3, 4 }; // error: no implicit conversion

2) Conversion function (operator)
A conversion function is never used to convert a (possibly cv-qualified) object to the (possibly cv-qualified) same object type (or a reference to it), to a (possibly cv-qualified) base class of that type (or a reference to it), or to (possibly cv-qualified) void.
A conversion function may be explicit , in which case it is only considered as a user-defined conversion for direct-initialization. Otherwise, user-defined conversions are not restricted to use in assignments and initializations.

Conversion functions are inherited.
Conversion functions can be virtual.
Conversion functions cannot be declared static.


conversion-function-id:
operator conversion-type-id
conversion-type-id:
type-specifier-seq conversion-declaratoropt
conversion-declarator:
ptr-operator conversion-declaratoropt

The conversion-type-id shall not represent a function type nor an array type.The conversion-type-id in a conversion-function-id is the longest possible sequence of conversion-declarators.

&ac.operator int*i; // syntax error:
// parsed as: &(ac.operator int *)i
// not as: &(ac.operator int)*i

class Y { };
struct Z {
    explicit operator Y() const;
};

void h(Z z) {
    Y y1(z); // OK: direct-initialization
    Y y2 = z; // ill-formed: copy-initialization
    Y y3 = (Y)z; // OK: cast notation
}

arning: Module 'androidx.test.uiautomator_uiautomator' depends on non-existing optional_uses_libs 'com.android.extensions.xr' Warning: Module 'androidx.wear_wear' depends on non-existing optional_uses_libs 'wear-sdk' Warning: Module 'androidx.wear.compose_compose-foundation' depends on non-existi ng optional_uses_libs 'wear-sdk' [ 0% 172/131877] //external/icu/icu4c/source:libicuuc_stubdata clang++ stubdata FAILED: out/soong/.intermediates/external/icu/icu4c/source/libicuuc_stubdata/lin ux_glibc_x86_64_static/obj/external/icu/icu4c/source/stubdata/stubdata.o PWD=/proc/self/cwd /usr/bin/ccache prebuilts/clang/host/linux-x86/clang-r547379/ bin/clang++ -c -Wa,--noexecstack -fPIC -fno-omit-frame-pointer -U_FORTIFY_SOURC E -D_FORTIFY_SOURCE=3 -fstack-protector --gcc-toolchain=prebuilts/gcc/linux-x86/ host/x86_64-linux-glibc2.17-4.8 -fstack-protector-strong -m64 --sysroot prebuilt s/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/sysroot -O2 -Wall -Wextra -Winit -self -Wpointer-arith -Wunguarded-availability -Werror=date-time -Werror=int-con version -Werror=pragma-pack -Werror=pragma-pack-suspicious-include -Werror=sizeo f-array-div -Werror=string-plus-int -Werror=unreachable-code-loop-increment -Wno -error=deprecated-declarations -Wno-c23-extensions -Wno-c99-designator -Wno-gnu- folding-constant -Wno-inconsistent-missing-override -Wno-error=reorder-init-list -Wno-reorder-init-list -Wno-sign-compare -Wno-unused -DANDROID -DNDEBUG -UDEBUG -D__compiler_offsetof=__builtin_offsetof -D__ANDROID_UNAVAILABLE_SYMBOLS_ARE_WE AK__ -faddrsig -fdebug-default-version=5 -fcolor-diagnostics -ffp-contract=off - fno-exceptions -fno-strict-aliasing -fmessage-length=0 -gsimple-template-names - gz=zstd -no-canonical-prefixes -fdebug-prefix-map=/proc/self/cwd= -ftrivial-auto -var-init=zero -Wno-unused-command-line-argument -g -Wno-enum-compare -Wno-enum -compare-switch -Wno-null-pointer-arithmetic -Wno-null-dereference -Wno-pointer- compare -Wno-final-dtor-non-final-class -Wno-psabi -Wno-null-pointer-subtraction -Wno-string-concatenation -Wno-deprecated-non-prototype -Wno-unused -Wno-deprec ated -Wno-error=format -target x86_64-linux-gnu -fPIC -Wimplicit-fallthrough -D _LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS -Wno-gnu-include-next -Iexternal/icu/ icu4c/source -Iexternal/icu/icu4c/source/common -Iexternal/icu/android_icu4c/inc lude -Iprebuilts/clang/host/linux-x86/clang-r547379/include/x86_64-unknown-linux -gnu/c++/v1 -Iprebuilts/clang/host/linux-x86/clang-r547379/include/c++/v1 -Wall -Werror -std=gnu++20 -fno-rtti -nostdinc++ -Isystem/core/include -Isystem/loggin g/liblog/include -Isystem/media/audio/include -Ihardware/libhardware/include -Ih ardware/libhardware_legacy/include -Ihardware/ril/include -Iframeworks/native/in clude -Iframeworks/native/opengl/include -Iframeworks/av/include -Werror=bool-o peration -Werror=dangling -Werror=format-insufficient-args -Werror=implicit-int- float-conversion -Werror=int-in-bool-context -Werror=int-to-pointer-cast -Werror =pointer-to-int-cast -Werror=xor-used-as-pow -Wimplicit-int-float-conversion -Wn o-void-pointer-to-enum-cast -Wno-void-pointer-to-int-cast -Wno-pointer-to-int-ca st -Werror=fortify-source -Wno-unused-variable -Wno-missing-field-initializers - Wno-packed-non-pod -Werror=address-of-temporary -Werror=incompatible-function-po inter-types -Werror=null-dereference -Werror=return-type -Wno-tautological-const ant-compare -Wno-tautological-type-limit-compare -Wno-implicit-int-float-convers ion -Wno-tautological-overlap-compare -Wno-deprecated-copy -Wno-range-loop-const ruct -Wno-zero-as-null-pointer-constant -Wno-deprecated-anon-enum-enum-conversio n -Wno-deprecated-enum-enum-conversion -Wno-error=pessimizing-move -Wno-non-c-ty pedef-for-linkage -Wno-align-mismatch -Wno-error=unused-but-set-variable -Wno-er ror=unused-but-set-parameter -Wno-error=deprecated-builtins -Wno-error=deprecate d -Wno-error=invalid-offsetof -Wno-vla-cxx-extension -Wno-cast-function-type-mis match -fcommon -Wno-format-insufficient-args -Wno-misleading-indentation -Wno-b itwise-instead-of-logical -Wno-unused -Wno-unused-parameter -Wno-unused-but-set- parameter -Wno-unqualified-std-cast-call -Wno-array-parameter -Wno-gnu-offsetof- extensions -Wno-pessimizing-move -MD -MF out/soong/.intermediates/external/icu/i cu4c/source/libicuuc_stubdata/linux_glibc_x86_64_static/obj/external/icu/icu4c/s ource/stubdata/stubdata.o.d -o out/soong/.intermediates/external/icu/icu4c/sourc e/libicuuc_stubdata/linux_glibc_x86_64_static/obj/external/icu/icu4c/source/stub data/stubdata.o external/icu/icu4c/source/stubdata/stubdata.cpp ccache: error: Failed to create directory /home/hya/.ccache/tmp: Read-only file system \nWrite to a read-only file system detected. Possible fixes include 1. Generate file directly to out/ which is ReadWrite, #recommend solution 2. BUILD_BROKEN_SRC_DIR_RW_ALLOWLIST := <my/path/1> <my/path/2> #discouraged, su bset of source tree will be RW 3. BUILD_BROKEN_SRC_DIR_IS_WRITABLE := true #highly discouraged, entire source t ree will be RW [ 0% 173/131877] //external/icu/libandroidicuinit:libandroidicuinit clang++ Icu FAILED: out/soong/.intermediates/external/icu/libandroidicuinit/libandroidicuini t/linux_glibc_x86_64_static/obj/external/icu/libandroidicuinit/IcuRegistration.o PWD=/proc/self/cwd /usr/bin/ccache prebuilts/clang/host/linux-x86/clang-r547379/ bin/clang++ -c -Wa,--noexecstack -fPIC -fno-omit-frame-pointer -U_FORTIFY_SOURC E -D_FORTIFY_SOURCE=3 -fstack-protector --gcc-toolchain=prebuilts/gcc/linux-x86/ host/x86_64-linux-glibc2.17-4.8 -fstack-protector-strong -m64 --sysroot prebuilt s/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/sysroot -O2 -Wall -Wextra -Winit -self -Wpointer-arith -Wunguarded-availability -Werror=date-time -Werror=int-con version -Werror=pragma-pack -Werror=pragma-pack-suspicious-include -Werror=sizeo f-array-div -Werror=string-plus-int -Werror=unreachable-code-loop-increment -Wno -error=deprecated-declarations -Wno-c23-extensions -Wno-c99-designator -Wno-gnu- folding-constant -Wno-inconsistent-missing-override -Wno-error=reorder-init-list -Wno-reorder-init-list -Wno-sign-compare -Wno-unused -DANDROID -DNDEBUG -UDEBUG -D__compiler_offsetof=__builtin_offsetof -D__ANDROID_UNAVAILABLE_SYMBOLS_ARE_WE AK__ -faddrsig -fdebug-default-version=5 -fcolor-diagnostics -ffp-contract=off - fno-exceptions -fno-strict-aliasing -fmessage-length=0 -gsimple-template-names - gz=zstd -no-canonical-prefixes -fdebug-prefix-map=/proc/self/cwd= -ftrivial-auto -var-init=zero -Wno-unused-command-line-argument -g -Wno-enum-compare -Wno-enum -compare-switch -Wno-null-pointer-arithmetic -Wno-null-dereference -Wno-pointer- compare -Wno-final-dtor-non-final-class -Wno-psabi -Wno-null-pointer-subtraction -Wno-string-concatenation -Wno-deprecated-non-prototype -Wno-unused -Wno-deprec ated -Wno-error=format -target x86_64-linux-gnu -fPIC -Wimplicit-fallthrough -D _LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS -Wno-gnu-include-next -Iexternal/icu/ libandroidicuinit/include -Iexternal/icu/libandroidicuinit -Iexternal/icu/icu4c/ source/common -Iexternal/icu/android_icu4c/include -Iprebuilts/clang/host/linux- x86/clang-r547379/include/x86_64-unknown-linux-gnu/c++/v1 -Iprebuilts/clang/host /linux-x86/clang-r547379/include/c++/v1 -Wall -Werror -std=gnu++20 -fno-rtti -no stdinc++ -Isystem/core/include -Isystem/logging/liblog/include -Isystem/media/au dio/include -Ihardware/libhardware/include -Ihardware/libhardware_legacy/include -Ihardware/ril/include -Iframeworks/native/include -Iframeworks/native/opengl/i nclude -Iframeworks/av/include -Werror=bool-operation -Werror=dangling -Werror= format-insufficient-args -Werror=implicit-int-float-conversion -Werror=int-in-bo ol-context -Werror=int-to-pointer-cast -Werror=pointer-to-int-cast -Werror=xor-u sed-as-pow -Wimplicit-int-float-conversion -Wno-void-pointer-to-enum-cast -Wno-v oid-pointer-to-int-cast -Wno-pointer-to-int-cast -Werror=fortify-source -Wno-unu sed-variable -Wno-missing-field-initializers -Wno-packed-non-pod -Werror=address -of-temporary -Werror=incompatible-function-pointer-types -Werror=null-dereferen ce -Werror=return-type -Wno-tautological-constant-compare -Wno-tautological-type -limit-compare -Wno-implicit-int-float-conversion -Wno-tautological-overlap-comp are -Wno-deprecated-copy -Wno-range-loop-construct -Wno-zero-as-null-pointer-con stant -Wno-deprecated-anon-enum-enum-conversion -Wno-deprecated-enum-enum-conver sion -Wno-error=pessimizing-move -Wno-non-c-typedef-for-linkage -Wno-align-misma tch -Wno-error=unused-but-set-variable -Wno-error=unused-but-set-parameter -Wno- error=deprecated-builtins -Wno-error=deprecated -Wno-error=invalid-offsetof -Wno -vla-cxx-extension -Wno-cast-function-type-mismatch -fcommon -Wno-format-insuff icient-args -Wno-misleading-indentation -Wno-bitwise-instead-of-logical -Wno-unu sed -Wno-unused-parameter -Wno-unused-but-set-parameter -Wno-unqualified-std-cas t-call -Wno-array-parameter -Wno-gnu-offsetof-extensions -Wno-pessimizing-move - MD -MF out/soong/.intermediates/external/icu/libandroidicuinit/libandroidicuinit /linux_glibc_x86_64_static/obj/external/icu/libandroidicuinit/IcuRegistration.o. d -o out/soong/.intermediates/external/icu/libandroidicuinit/libandroidicuinit/l inux_glibc_x86_64_static/obj/external/icu/libandroidicuinit/IcuRegistration.o ex ternal/icu/libandroidicuinit/IcuRegistration.cpp ccache: error: Failed to create directory /home/hya/.ccache/tmp: Read-only file system \nWrite to a read-only file system detected. Possible fixes include 1. Generate file directly to out/ which is ReadWrite, #recommend solution 2. BUILD_BROKEN_SRC_DIR_RW_ALLOWLIST := <my/path/1> <my/path/2> #discouraged, su bset of source tree will be RW 3. BUILD_BROKEN_SRC_DIR_IS_WRITABLE := true #highly discouraged, entire source t ree will be RW [ 0% 174/131877] //external/icu/libandroidicuinit:libandroidicuinit clang++ and FAILED: out/soong/.intermediates/external/icu/libandroidicuinit/libandroidicuini t/linux_glibc_x86_64_static/obj/external/icu/libandroidicuinit/android_icu_init. o PWD=/proc/self/cwd /usr/bin/ccache prebuilts/clang/host/linux-x86/clang-r547379/ bin/clang++ -c -Wa,--noexecstack -fPIC -fno-omit-frame-pointer -U_FORTIFY_SOURC E -D_FORTIFY_SOURCE=3 -fstack-protector --gcc-toolchain=prebuilts/gcc/linux-x86/ host/x86_64-linux-glibc2.17-4.8 -fstack-protector-strong -m64 --sysroot prebuilt s/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/sysroot -O2 -Wall -Wextra -Winit -self -Wpointer-arith -Wunguarded-availability -Werror=date-time -Werror=int-con version -Werror=pragma-pack -Werror=pragma-pack-suspicious-include -Werror=sizeo f-array-div -Werror=string-plus-int -Werror=unreachable-code-loop-increment -Wno -error=deprecated-declarations -Wno-c23-extensions -Wno-c99-designator -Wno-gnu- folding-constant -Wno-inconsistent-missing-override -Wno-error=reorder-init-list -Wno-reorder-init-list -Wno-sign-compare -Wno-unused -DANDROID -DNDEBUG -UDEBUG -D__compiler_offsetof=__builtin_offsetof -D__ANDROID_UNAVAILABLE_SYMBOLS_ARE_WE AK__ -faddrsig -fdebug-default-version=5 -fcolor-diagnostics -ffp-contract=off - fno-exceptions -fno-strict-aliasing -fmessage-length=0 -gsimple-template-names - gz=zstd -no-canonical-prefixes -fdebug-prefix-map=/proc/self/cwd= -ftrivial-auto -var-init=zero -Wno-unused-command-line-argument -g -Wno-enum-compare -Wno-enum -compare-switch -Wno-null-pointer-arithmetic -Wno-null-dereference -Wno-pointer- compare -Wno-final-dtor-non-final-class -Wno-psabi -Wno-null-pointer-subtraction -Wno-string-concatenation -Wno-deprecated-non-prototype -Wno-unused -Wno-deprec ated -Wno-error=format -target x86_64-linux-gnu -fPIC -Wimplicit-fallthrough -D _LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS -Wno-gnu-include-next -Iexternal/icu/ libandroidicuinit/include -Iexternal/icu/libandroidicuinit -Iexternal/icu/icu4c/ source/common -Iexternal/icu/android_icu4c/include -Iprebuilts/clang/host/linux- x86/clang-r547379/include/x86_64-unknown-linux-gnu/c++/v1 -Iprebuilts/clang/host /linux-x86/clang-r547379/include/c++/v1 -Wall -Werror -std=gnu++20 -fno-rtti -no stdinc++ -Isystem/core/include -Isystem/logging/liblog/include -Isystem/media/au dio/include -Ihardware/libhardware/include -Ihardware/libhardware_legacy/include -Ihardware/ril/include -Iframeworks/native/include -Iframeworks/native/opengl/i nclude -Iframeworks/av/include -Werror=bool-operation -Werror=dangling -Werror= format-insufficient-args -Werror=implicit-int-float-conversion -Werror=int-in-bo ol-context -Werror=int-to-pointer-cast -Werror=pointer-to-int-cast -Werror=xor-u sed-as-pow -Wimplicit-int-float-conversion -Wno-void-pointer-to-enum-cast -Wno-v oid-pointer-to-int-cast -Wno-pointer-to-int-cast -Werror=fortify-source -Wno-unu sed-variable -Wno-missing-field-initializers -Wno-packed-non-pod -Werror=address -of-temporary -Werror=incompatible-function-pointer-types -Werror=null-dereferen ce -Werror=return-type -Wno-tautological-constant-compare -Wno-tautological-type -limit-compare -Wno-implicit-int-float-conversion -Wno-tautological-overlap-comp are -Wno-deprecated-copy -Wno-range-loop-construct -Wno-zero-as-null-pointer-con stant -Wno-deprecated-anon-enum-enum-conversion -Wno-deprecated-enum-enum-conver sion -Wno-error=pessimizing-move -Wno-non-c-typedef-for-linkage -Wno-align-misma tch -Wno-error=unused-but-set-variable -Wno-error=unused-but-set-parameter -Wno- error=deprecated-builtins -Wno-error=deprecated -Wno-error=invalid-offsetof -Wno -vla-cxx-extension -Wno-cast-function-type-mismatch -fcommon -Wno-format-insuff icient-args -Wno-misleading-indentation -Wno-bitwise-instead-of-logical -Wno-unu sed -Wno-unused-parameter -Wno-unused-but-set-parameter -Wno-unqualified-std-cas t-call -Wno-array-parameter -Wno-gnu-offsetof-extensions -Wno-pessimizing-move - MD -MF out/soong/.intermediates/external/icu/libandroidicuinit/libandroidicuinit /linux_glibc_x86_64_static/obj/external/icu/libandroidicuinit/android_icu_init.o .d -o out/soong/.intermediates/external/icu/libandroidicuinit/libandroidicuinit/ linux_glibc_x86_64_static/obj/external/icu/libandroidicuinit/android_icu_init.o external/icu/libandroidicuinit/android_icu_init.cpp ccache: error: Failed to create directory /home/hya/.ccache/tmp: Read-only file system \nWrite to a read-only file system detected. Possible fixes include 1. Generate file directly to out/ which is ReadWrite, #recommend solution 2. BUILD_BROKEN_SRC_DIR_RW_ALLOWLIST := <my/path/1> <my/path/2> #discouraged, su bset of source tree will be RW 3. BUILD_BROKEN_SRC_DIR_IS_WRITABLE := true #highly discouraged, entire source t ree will be RW 02:46:49 ninja failed with: exit status 1 #### failed to build some targets (10:52 (mm:ss)) ####
最新发布
09-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值