Ввод временного адреса в одном и том же фрагменте кода — всегда безопасно?

#c #unit-testing #c 11 #pointers #variables

Вопрос:

Мне нужно протестировать некоторый код, и методы принимают указатели на объекты. Поскольку я хочу написать много тестов, упрощенные мои тесты выглядят так

 bool addPoint(Point* point);

EXPECT_TRUE(addPoint(amp;Point(0, 0, 0)));
EXPECT_TRUE(addPoint(amp;Point(-10, 0, 0)));
EXPECT_TRUE(addPoint(amp;Point(0, -10, 0)));
//and so on
 

Это прекрасно работает. Я знаю, что брать адрес временной переменной-не очень хороший стиль, но в противном случае мне придется вводить гораздо больше, создавая правильные точечные объекты и передавая их в тест.

Насколько я знаю, временный адрес не является UB, поэтому я могу полагаться на то, что мои тесты всегда будут работать так, как они работают сейчас? Или есть какие-то другие недостатки в использовании временного адреса?

Комментарии:

1. amp;Point(0, 0, 0) не следует компилировать, если Point только он не перегружен operator amp; . timsong-cpp.github.io/cppwp/expr.unary.op#3

2. » Я знаю, что использование адреса временной переменной не является хорошим стилем » — это не просто плохой стиль, это технически незаконно, код даже не должен компилироваться в нормальных условиях. Вероятно, вы используете компилятор, который позволяет использовать его в качестве нестандартного расширения. В этом случае я бы просто ввел вспомогательную перегрузку, например: bool addPoint(Point point) { return addPoint(amp;point); } или bool addPoint(const Point amp;point) { return addPoint(const_cast<Point*>(amp;point)); } или bool addPoint(int x, int y, int z) { Point point(x, y, z); return addPoint(amp;point); }

3. … А затем вы можете отказаться amp; от своих addPoint() звонков, например: EXPECT_TRUE(addPoint(Point(0, 0, 0))); EXPECT_TRUE(addPoint(Point(-10, 0, 0))); EXPECT_TRUE(addPoint(Point(0, -10, 0))); //and so on или EXPECT_TRUE(addPoint({0, 0, 0})); EXPECT_TRUE(addPoint({-10, 0, 0})); EXPECT_TRUE(addPoint({0, -10, 0})); //and so on или EXPECT_TRUE(addPoint(0, 0, 0)); EXPECT_TRUE(addPoint(-10, 0, 0)); EXPECT_TRUE(addPoint(0, -10, 0)); //and so on

4. Эта проблема может быть устранена путем передачи параметров по ссылке или постоянной ссылки, если параметр не изменен.

5. Он не работает в MSVC при компиляции с /Za (отключите языковые расширения). В любом случае, использование временного адреса недопустимо в C , и его лучше избегать, даже если ваш компилятор примет его как нестандартное расширение.