TGViewer
C++: Хроники Дурки🚑 C++: Хроники Дурки🚑 @cpp_durka · 916 subscribers
Post #18 1.11K
implicit конструирование типов вообще сплошная головная боль.

Но мой любимый лефтикус в одном из своих докладов (чет не помню, в каком, но в последние пару лет) поделился синтаксическим трюком, как их запретить.

Вот у нас есть пример.


struct Path {
Path(const std::string& p) : path(p) {}
Path(const char* p) : path(p) {}
std::string path;
};

void f(const Path& path, const std::string& mode) {
std::cout << "Path: " << path.path << std::endl;
std::cout << "Mode: " << mode << std::endl;
}


Мы хотим как-то запускать функцию f.

У нас, казалось бы, есть защита от неправильного порядка аргументов.


f(Path("/etc/tmp"), std::string{"rw"});

// f(std::string{"rw"}, Path("/etc/tmp"));
// error: no matching function for call to 'f'


Но есть проблема. Оба типа могут неявно конструироваться от строки. Вот эти обе строчки сработают:


f("/etc/tmp", "rw");
f("rw", "/etc/tmp");



Есть решение! Нам поможет вот такая конструкция:

```cpp
void f(const auto&, const auto&) = delete;
void f(const Path& path, const std::string& mode) {
std::cout << "Path: " << path.path << std::endl;
std::cout << "Mode: " << mode << std::endl;
}
```

Что мы теперь получим при вызове функций от голых строк?

```
<source>:18:5: error: call to deleted function 'f'
18 | f("/etc/tmp", "rw");
```

Прекрасный трюк, очень мне нравится.
  • 🔥 15
  • 🤔 3
More from @cpp_durka
  1. Sep 8, 2026Мошенники заставили пенсионерку из Москвы переписать квартиру на Rust
  2. Aug 31, 2026Всяко разное болезненное есть в С++, из всего болезненного одно из самых болезненных - это…
  3. Aug 24, 2026Если кто не знаком с библиотекой nlohmann/json - она прекрасна. Мои мысли о том, как должн…
  4. Aug 21, 2026#толькосвоимемы Код взят тут. if (dim == 0) idx_dim = i0; else if (dim == 1) idx_dim = i1;…
  5. Aug 17, 2026Ладно, искать баги в компиляторах весело, но недостаточно. Давайте поиграемся в чуть более…
  6. Aug 10, 2026Ладно, разумеется прошлый пост был набросом. Никогда не обновляйте компиляторы без очень с…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →