Skip to content

[Bug]: flat_hash_map incorrectly reports copyability #1862

Open
@asoffer

Description

@asoffer

Describe the issue

std::is_copy_constructible_v<absl::flat_hash_map<K, V>> is true even when std::is_copy_constructible_v<V> is false.

Steps to reproduce the problem

https://godbolt.org/z/M7M9bqG5c

What version of Abseil are you using?

20250121.0

What operating system and version are you using?

Tested on Ubuntu, MacOS.

What compiler and version are you using?

Tested on both clang and gcc

What build system are you using?

bazel 8.1.1

Additional context

Being sfinae friendly here is pretty important because standard library containers expect it. In my case, I had a std::vector<std::pair<A, B>> where B was a wrapper around an absl::flat_hash_map<std::string, MoveOnly>. Calls to emplace_back<A&&, B&&>, which was very confusing.

The workaround is to explicitly declare the copy/move constructors explicitly for my wrapper as delete/default respectively so the trait doesn't dig into the implementation.

FWIW, std::unordered_map seems to have the same problem in both libc++ and libstdc++. I don't know of anything in the standard that requires this behavior. Also because it's detectable, a change can in theory constitute an ABI break, so that's fun. I know Abseil doesn't care, but there's an interesting question about divergence from standard behavior here.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions