不是哥们

来点反直觉的 😅


开胃小菜 & 情感铺垫:

int a = 1;
const int *p1 = &a;
int const *p2 = &a; // be equal to p1
int *const p3 = &a;
const auto p4 = &a; // be equal to p3
auto const p5 = &a; // be equal to p3
const int *const p6 = &a;
p1 = &a; // OK
*p1 = 1; // CE, *p1 is read-only
p3 = &a; // CE, p3 is read-only
*p3 = 1; // OK
p6 = &a; // CE, p6 is read-only
*p6 = 1; // CE, *p6 is read-only

拉坨大的:

const int p1 = 1e9 + 7; // OK
int const p2 = 998244353; // OK, be equal to p1
p1 = p2; // CE, p1 is read-only
const_cast<int&>(p1) = p2; // UB, attempt to modify const object p1
auto *p = &p1;
*p = p2; // CE, *p is read-only, OK on VS C++
const struct { mutable int p3; } x { p1 };
x.p3 = p2; // OK, p3 is mutable

开窜:

#include <memory>
#include <string>
#include <iostream>
auto main() -> int {
    using Node = struct displayer {
        mutable std::string c;
        auto operator-> (void) const {
            std::cout << "c = " << c << std::endl;
            return this;
        }
        auto& operator, (const int q) {
            c += std::to_string(q);
            return *this;
        }
    } const;
    std::cout << (displayer{ "1" }, 14, 514)->c << std::endl; 
    std::cout << (displayer{ "1" }, 14, 514) << std::endl; // CE
    std::cout << (Node{ "1" }, 14, 514)->c << std::endl; // CE
    std::cout << (Node{ "1" }, 14, 514) << std::endl;
    return 0;
}

预期输出:

c = 114514
114514
514
posted @ 2024-09-03 21:35  XSC062  阅读(6)  评论(0编辑  收藏  举报