【发布时间】:2019-03-31 20:18:46
【问题描述】:
对于下面的代码sn-p:
#include <utility>
#include <iostream>
#define C(name) (name ? name : "nullptr")
#define PP { std::cout << __PRETTY_FUNCTION__ << " : " << C(name) << '\n'; }
#define T { std::cout << __PRETTY_FUNCTION__ << " : " << C(name) << " -> " << C(rhs.name) << '\n'; }
struct A
{
const char * name = nullptr;
A(const char * name) : name{name} PP
A(A && rhs) : name{std::exchange(rhs.name, nullptr)} PP
A(const A & rhs) : name{rhs.name} PP
A & operator = (A && rhs) { T; std::swap(name, rhs.name); return *this; }
A & operator = (const A && rhs) { T; name = rhs.name; return *this; }
~A() PP
};
#include <random>
int main()
{
std::random_device d;
A a{"a"};
A b{"b"};
A c{"c"};
std::cout << "begin\n";
a = ((d() % 2) == 0) ? b : std::move(c);
std::cout << "end\n";
}
可能有以下两种输出:
A::A(const char*) : a
A::A(const char*) : b
A::A(const char*) : c
begin
A::A(A&&) : c
A& A::operator=(A&&) : a -> c
A::~A() : a
end
A::~A() : nullptr
A::~A() : b
A::~A() : c
和
A::A(const char*) : a
A::A(const char*) : b
A::A(const char*) : c
begin
A::A(const A&) : b
A& A::operator=(A&&) : a -> b
A::~A() : a
end
A::~A() : c
A::~A() : b
A::~A() : b
在上述情况下,编译器是否可以(根据标准)避免在使用三元运算符进行复制/移动赋值期间使用临时值,并分派到复制或移动赋值运算符以分配右侧的值 ( b 或 c) 直接到左侧 (a) 取决于条件?
【问题讨论】:
-
你的意思是
if ((d() % 2) == 0) a = b; else a = std::move(c);? -
@Evg 是的。有点
标签: c++ language-lawyer ternary-operator move-semantics value-categories