c++ 使用花括号的示例化-它是什么,为什么在这里使用它?

iqxoj9l9  于 2022-12-15  发布在  其他
关注(0)|答案(2)|浏览(124)

最近我偶然发现了一篇关于如何在现代C++中导入dll库的this文章。代码完全让我不知所措,所以我一行一行地看了一遍,试图弄清楚它的含义。到现在为止,我认为我明白了,但有一件事我仍然不清楚:

class ShellApi {
  DllHelper _dll{"Shell32.dll"};

  /* ... */
};

class DllHelper {
public:
  explicit DllHelper(LPCTSTR filename) : _module(LoadLibrary(filename)) {}    
  /* ... */

private:
  HMODULE _module;
};

为什么示例化DllHelper _dll{"Shell32.dll"}是用花括号而不是普通的花括号写的?我在Visual Studio中试过了,不得不意识到这个代码段不能用普通的花括号。为什么不能?这种示例化是如何调用的(这样我可以稍后查找)?还有其他使用这种方法的场景吗?
如果我提供的代码不足以回答这个问题,文章中提供了完整的代码。

bwleehnv

bwleehnv1#

列表初始化从C++11就存在了,现在通常被看作是初始化对象的实际方式(除了一些特殊情况):

std::string s{"foo"};  // Initialize the std::string s with "foo"

列表初始化和直接初始化之间存在差异,这些差异在https://en.cppreference.com/w/cpp/language/list_initialization上进行了总结,其中一些差异如下:

  • 列表初始化不允许收缩转换:
int f();
char c1(f()); // Ok
char c2{f()}; // error: narrowing conversion from int to char
struct X { };

X x1(X()); // x1 is a function
X x2{X{}}; // x2 is a X
  • 在您示例中,列表初始化用于默认初始化ShellApi的非静态成员,您不能使用()来初始化它:
struct X {
   int a1{1};   // Ok
   int a2 = 1;  // Ok
   int a3(1);   // Nok

   int b{};  // Ok, b is an int member default-initialized to 0
   int b();  // Ok, b is a member-function returning an int
};
snz8szmq

snz8szmq2#

我一直在努力让它工作,但C真的不喜欢这行
DllHelper _dll{“ shell 32.dll”};
C
它没有读取_dll,而它应该读取的HMODULE定义是有效的

相关问题