9

これまでにスコープガードを見たものはすべて、ガードブール変数を持っています。たとえば、次のディスカッションを参照してください: 最もシンプルできちんとした c++11 ScopeGuard

ただし、単純なガードは機能します (gcc 4.9、clang 3.6.0):

template <class C>
struct finally_t : public C {
    finally_t(C&& c): C(c) {}
    ~finally_t() { (*this)(); }
};
template <class C>
static finally_t<C> finally_create(C&& c) {
    return std::forward<C>(c);
}
#define FINCAT_(a, b) a ## b
#define FINCAT(a, b) FINCAT_(a, b)
#define FINALLY(...) auto FINCAT(FINALY_, __LINE__) = \
    finally_create([=](){ __VA_ARGS__ })

int main() {
    int a = 1;
    FINALLY( std::cout << "hello" << a << std::endl ; );
    FINALLY( std::cout << "world" << a << std::endl ; );
    return 0;
}

一時コピーが破棄されないのはなぜですか? この動作に依存するのは危険ですか?

4

1 に答える 1

1

Copy Elision (この場合は Move Elision) の効果を観察しています。Copy Elision は保証/必須ではありませんが、通常、最適化なしでコンパイルする場合でも、主要なコンパイラによって実行されます。gcc の -fno-elide-constructors を試して「壊れている」ことを確認してください: http://melpon.org/wandbox/permlink/B73EuYYKGYFMnJtR

于 2015-11-23T11:50:33.403 に答える