CodeNebula
C++11stlintermediate

std::is_trivially_destructible (C++11 Addition)

C++11 · Modern Revolution · Compiler flag: -std=c++11

Explanation

Compile-time check that determines whether a type has a trivial destructor, meaning no cleanup logic runs on destruction.

Real-World Scenario

Skip destructor calls when deallocating arrays of trivially destructible types for performance.

Quick Snippet

snippet.cpp
#include <type_traits>
static_assert(std::is_trivially_destructible<int>::value, "int is trivially destructible");

Full Example

is_trivially_destructible.cpp
// CodeNebula - C++11 Example: is_trivially_destructible
// Compile: g++ -std=c++11 -Wall -Wextra -o example is_trivially_destructible.cpp

// Demonstrates std::is_trivially_destructible to check if a type has
// a trivial (compiler-generated, do-nothing) destructor.

#include <iostream>
#include <type_traits>
#include <string>
#include <vector>

struct Trivial { int x; double y; };

struct WithVirtualDtor {
    virtual ~WithVirtualDtor() {}
};

struct WithCustomDtor {
    ~WithCustomDtor() { /* cleanup */ }
};

struct WithStringMember {
    std::string name;  // string has non-trivial destructor
};

int main() {
    std::cout << "=== std::is_trivially_destructible ===" << std::endl;

    std::cout << "int:              " << std::is_trivially_destructible<int>::value << std::endl;
    std::cout << "double:           " << std::is_trivially_destructible<double>::value << std::endl;
    std::cout << "Trivial:          " << std::is_trivially_destructible<Trivial>::value << std::endl;
    std::cout << "WithVirtualDtor:  " << std::is_trivially_destructible<WithVirtualDtor>::value << std::endl;
    std::cout << "WithCustomDtor:   " << std::is_trivially_destructible<WithCustomDtor>::value << std::endl;
    std::cout << "WithStringMember: " << std::is_trivially_destructible<WithStringMember>::value << std::endl;
    std::cout << "std::string:      " << std::is_trivially_destructible<std::string>::value << std::endl;
    std::cout << "std::vector<int>: " << std::is_trivially_destructible<std::vector<int>>::value << std::endl;

    static_assert(std::is_trivially_destructible<int>::value, "int is trivially destructible");
    static_assert(std::is_trivially_destructible<Trivial>::value, "POD is trivially destructible");
    static_assert(!std::is_trivially_destructible<std::string>::value, "string is not");

    std::cout << "\nAll checks passed!" << std::endl;
    return 0;
}

// Expected output:
// === std::is_trivially_destructible ===
// int:              1
// double:           1
// Trivial:          1
// WithVirtualDtor:  0
// WithCustomDtor:   0
// WithStringMember: 0
// std::string:      0
// std::vector<int>: 0
//
// All checks passed!
Run command
g++ -std=c++11 -Wall -Wextra -o example is_trivially_destructible.cpp