2016-11-27 4 views
3

Я пытаюсь выяснить, есть ли что-либо в спецификации C++ 11 re. ожидаемое поведение для следующего кода (GitHub link here):C++ Порядок оценки

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 

Ответ, кажется, что это должно быть в § 5.2.2 и § 5.2.5 от , но у меня возникают проблемы с отслеживанием чего-то конкретного.

+1

'квадрат()' и 'получить()' должен быть вызван перед вызовом 'масштаба() '. Но относительный порядок между ними не определен стандартом. – StoryTeller

+1

Я бы не мечтал попробовать что-то вроде этого. Неопределенное поведение полностью. –

+0

Если вам нужно что-то конкретное представить студентам, для которых вы ТАИНГ, вот те вопросы, которые вы задаете ( – Pockets

ответ

8

Если я правильно прочитал, поведение вашего кода не указано. N3337 для C++ 11 цитат:

§ 1.9 [intro.execution]/15

За исключением особо оговоренных случаев, оценки операндами отдельных операторов и подвыражений отдельных выражений unsequenced. [...] Если побочный эффект на скалярном объекте не зависит от другого побочного эффекта на том же скалярном объекте или вычисления значения с использованием значения одного и того же скалярного объекта, поведение не определено.

но следует с

Каждой оценкой в ​​вызывающей функции (в том числе других функций вызовов), которые иначе не конкретно секвенировали до или после того, как выполнения тела вызываемой функции неопределенно , упорядоченный относительно выполнения функции .

9) Иными словами, выполнение функций не чередуется с каждым другим.

и

§ 5.2.2 [expr.call]/8

[Примечание: В оценки экспрессии постфикса и таких аргументов выражений все unsequenced по отношению к друг друга. Все побочные эффекты оценок выражения аргументов секвенированы до , функция вводится (см. 1.9). -end примечание]

Итак, ваша модификация и не имеет отношения считывания Scalar::data являются неопределенно секвенировали.

Это, как говорится, это, вероятно, изменится и быть четко определены в C++ 1z:

N4606 § 5.2.2 [выражение.звоните]/5

постфикса выражение секвенировало перед каждым выражения в список_выражениях и аргумент любого по умолчанию. Инициализация параметра , включающего в себя все связанные вычисления значения и побочный эффект , неопределенно упорядочена по сравнению с параметром любого другого параметра .

Таким образом, в C++ 1z ваш v.data должен быть равен 81 (если я читаю вещи правильно)

+2

Pre-C++ 11, когда мы говорили о точках последовательности, была последовательность точка до и после каждого вызова функции.Это бы сделать выражение хорошо определенным, но с неопределенным результатом в зависимости от порядка вызовов. –

+0

@TC Как это релевантно? Оценка аргументов функции и постфиксного выражения, обозначающего вызываемый функция обе секвентированы перед выполнением тела функции, но они не упорядочены относительно друг друга. – krzaq

+1

А, подождите, я c/p'd неверная цитата. Я имел в виду «Каждая оценка в вызывающей функции (включая другую функцию звонки), которые иначе не секвентируются иначе до или после того, как выполнение тела вызываемой функции неопределенно упорядочено в отношении выполнения функции calle d функции ". Теперь рассмотрим, что в этом утверждении есть три вызова функций. –

Смежные вопросы