The more fancy contemporary C++ becomes, the worse effects it causes to dynamic linkage. The old-school C++ from 90s was bearable with certain limitations, not many. Templates have caused a serious damage to dll interface design. But modern C++ must not be let out across binary module bounds, absolutely.

You want to expose some object model from binary module, you go with pure interfaces and no STL in method parameters. You decide to create a dll in C++ project, you think not like twice, but two dozen times. You decide to go with dll, you need to be sure you know what you do and why you do that what you do. And if you're not, you just avoid doing dll.