为什么 volatile 不能用 std::min 编译
Why is volatile not compiling with std::min
为什么以下代码无法编译 (gcc-5.4.0)?
volatile int i{100};
int j{200};
std::cout << std::min(i, j);
我的意思是我看到编译器错误:
error: no matching function for call to ‘min(volatile int&, int&)’
volatile 不只是向编译器提示变量可以从程序外部更改吗?
std::min(int(i), j);
当然有效。但原创作品不也应该如此吗?
volatile
是一个 限定符 ,就像 const
一样。它不仅仅是对编译器的提示。
std::min
期望两个参数具有完全相同的类型和限定符。因此,在您的情况下,它会发出诊断信息。
既然你被允许引入限定词,你可以手把手地写
std::min<volatile int>(i, j)
正如@Bathsheba 所指出的,两个参数的类型推导必须给出相同的类型。
但为了完整起见,std::min
也被重载以接受一个 std::initializer_list
。它的元素受复制初始化的影响,因此顶级 cv 限定符是无关紧要的。所以这会起作用:
std::cout << std::min({i, j});
请记住,它执行复制,不接受或 return 引用。
为什么以下代码无法编译 (gcc-5.4.0)?
volatile int i{100};
int j{200};
std::cout << std::min(i, j);
我的意思是我看到编译器错误:
error: no matching function for call to ‘min(volatile int&, int&)’
volatile 不只是向编译器提示变量可以从程序外部更改吗?
std::min(int(i), j);
当然有效。但原创作品不也应该如此吗?
volatile
是一个 限定符 ,就像 const
一样。它不仅仅是对编译器的提示。
std::min
期望两个参数具有完全相同的类型和限定符。因此,在您的情况下,它会发出诊断信息。
既然你被允许引入限定词,你可以手把手地写
std::min<volatile int>(i, j)
正如@Bathsheba 所指出的,两个参数的类型推导必须给出相同的类型。
但为了完整起见,std::min
也被重载以接受一个 std::initializer_list
。它的元素受复制初始化的影响,因此顶级 cv 限定符是无关紧要的。所以这会起作用:
std::cout << std::min({i, j});
请记住,它执行复制,不接受或 return 引用。