我试图弄清楚 C++11 规范中是否有任何内容。以下代码 ( GitHub link here ) 的预期行为:

struct Scalar {
    int data;

    Scalar(int x) : data(x) {}

    int get() {
        return data;
    }

    Scalar &square() {
        scale(data);
        return *this;
    }

    void scale(int rhs) {
        data *= rhs;
    }
};

int main() {
    Scalar v(3);

    v.square().scale(v.get());

    return v.data;
}

这主要是因为发现这在 g++clang++ 之间做了不同的事情:
$ g++ --version
g++ (GCC) 6.2.1 20160830
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ clang++ --version
clang version 3.9.0 (tags/RELEASE_390/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

$ g++ -std=c++11 order_of_ops.cpp -o a.out && ./a.out; echo $?
27

$ clang++ -std=c++11 order_of_ops.cpp -o a.out && ./a.out; echo $?
81

答案似乎应该在 n3242 的 § 5.2.2 和 § 5.2.5 中,但我无法找到具体的内容。

最佳答案

如果我没看错的话,你的代码的行为是未指定的。 N3337 用于 C++11 报价:



但它遵循







因此,您对 Scalar::data 的修改和无关读取是不确定的。

话虽如此,它很可能会在 C++1z 中改变并得到明确定义:



因此,在 C++1z 中,你的 v.data 应该等于 81(如果我没看错的话)

关于C++ 求值顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40827303/

10-11 01:04