C++11stlintermediate
std::is_trivially_constructible (C++11 Addition)
C++11 · Modern Revolution · Compiler flag: -std=c++11
Explanation
Compile-time check that determines whether a type can be trivially constructed, meaning no user-defined constructor logic runs.
Real-World Scenario
Optimize container allocation by skipping initialization for trivially constructible types.
Quick Snippet
snippet.cpp
#include <type_traits>
static_assert(std::is_trivially_constructible<int>::value, "int is trivially constructible");Full Example
is_trivially_constructible.cpp
// CodeNebula - C++11 Example: is_trivially_constructible
// Compile: g++ -std=c++11 -Wall -Wextra -o example is_trivially_constructible.cpp
// Demonstrates std::is_trivially_constructible and related traits.
// A trivial constructor does nothing (compiler-generated default).
#include <iostream>
#include <type_traits>
#include <string>
struct Trivial { int x; double y; };
struct NonTrivial {
NonTrivial() : x(42) {} // user-defined constructor
int x;
};
struct WithDefault {
WithDefault() = default; // explicitly defaulted is still trivial
int x;
};
struct WithString {
std::string name; // string has non-trivial constructor
};
int main() {
std::cout << "=== std::is_trivially_constructible ===" << std::endl;
// Default constructible (no args)
std::cout << "Trivial: "
<< std::is_trivially_constructible<Trivial>::value << std::endl;
std::cout << "NonTrivial: "
<< std::is_trivially_constructible<NonTrivial>::value << std::endl;
std::cout << "WithDefault: "
<< std::is_trivially_constructible<WithDefault>::value << std::endl;
std::cout << "WithString: "
<< std::is_trivially_constructible<WithString>::value << std::endl;
std::cout << "int: "
<< std::is_trivially_constructible<int>::value << std::endl;
// Also check trivially default constructible
std::cout << "\n--- is_trivially_default_constructible ---" << std::endl;
std::cout << "Trivial: "
<< std::is_trivially_default_constructible<Trivial>::value << std::endl;
std::cout << "int: "
<< std::is_trivially_default_constructible<int>::value << std::endl;
std::cout << "std::string: "
<< std::is_trivially_default_constructible<std::string>::value << std::endl;
static_assert(std::is_trivially_constructible<int>::value, "int is trivial");
static_assert(!std::is_trivially_constructible<NonTrivial>::value, "custom ctor");
std::cout << "\nAll checks passed!" << std::endl;
return 0;
}
// Expected output:
// === std::is_trivially_constructible ===
// Trivial: 1
// NonTrivial: 0
// WithDefault: 1
// WithString: 0
// int: 1
//
// --- is_trivially_default_constructible ---
// Trivial: 1
// int: 1
// std::string: 0
//
// All checks passed!
Run command
g++ -std=c++11 -Wall -Wextra -o example is_trivially_constructible.cpp