abseil / abseil/abseil-cpp

[Bug]: `flat_hash_map` incorrectly reports copyability

Aperta
#1,862 2 commenti 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
C++
Stelle
18.1k
Fork
3.2k
Merge medio
20h 36m
PR unite (30g)
1

Descrizione

### Describe the issue

`std::is_copy_constructible_v>` is `true` even when `std::is_copy_constructible_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>` where `B` was a wrapper around an `absl::flat_hash_map`. Calls to `emplace_back`, 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.

Guida per i contributori

Apri la guida per i contributori

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.