为什么编译器允许用户更改 'auto' 变量的类型?
Why does a compiler allow a user to change the type of an 'auto' variable?
我希望 auto
关键字能够一次从初始化程序中推断出变量的类型,并在整个代码中保持该类型。令我惊讶的是,我的编译器 (g++ 9.3.0
) 允许我更改它的类型并且它仍然有效。当我首先将变量用作 int 然后用作 float 时,这对我来说是可以接受的。但是当我使用 auto
关键字声明一个字符串然后为该变量分配一个浮点值时,编译器不会抛出错误但也不会在浮点赋值后打印值。有人可以解释为什么它首先允许将浮点值分配给字符串变量吗?编译器是否每次都接受新的分配?或者它会抛出某种我无法捕获的异常吗?下面的代码 -
#include <iostream>
int main()
{
auto x = '2';
std::cout << x << std::endl;
x = 3.0; // Why is this allowed?
std::cout << x << std::endl; // This won't print
return 0;
}
为了向您展示发生了什么,我通过一些编译时类型检查扩展了示例:
#include <type_traits>
#include <iostream>
int main()
{
auto x = '2';
// decltype(x) is the type for variable x
// compare it at compile time with char type
static_assert(std::is_same_v<decltype(x), char>);
std::cout << x << std::endl;
x = 3.0; // Why is this allowed? because it does a narrowing conversion from double to char
// my compiler even gives this warning :
// main.cpp(11,6): warning C4244: '=': conversion from 'double' to 'char', possible loss of data
// type of x is still the same and it is still a char
static_assert(std::is_same_v<decltype(x), char>);
std::cout << static_cast<int>(x) << std::endl; // the cast is here to be able to print the actual value of the char
return 0;
}
But when I use the auto keyword to declare a string
你糊涂了。此代码声明类型为 char
:
的变量
auto x = '2';
如果你想声明一个字符串,你必须使用双引号:
auto x = "2";
3.0
的后续赋值将不会通过此更改进行编译。
我希望 auto
关键字能够一次从初始化程序中推断出变量的类型,并在整个代码中保持该类型。令我惊讶的是,我的编译器 (g++ 9.3.0
) 允许我更改它的类型并且它仍然有效。当我首先将变量用作 int 然后用作 float 时,这对我来说是可以接受的。但是当我使用 auto
关键字声明一个字符串然后为该变量分配一个浮点值时,编译器不会抛出错误但也不会在浮点赋值后打印值。有人可以解释为什么它首先允许将浮点值分配给字符串变量吗?编译器是否每次都接受新的分配?或者它会抛出某种我无法捕获的异常吗?下面的代码 -
#include <iostream>
int main()
{
auto x = '2';
std::cout << x << std::endl;
x = 3.0; // Why is this allowed?
std::cout << x << std::endl; // This won't print
return 0;
}
为了向您展示发生了什么,我通过一些编译时类型检查扩展了示例:
#include <type_traits>
#include <iostream>
int main()
{
auto x = '2';
// decltype(x) is the type for variable x
// compare it at compile time with char type
static_assert(std::is_same_v<decltype(x), char>);
std::cout << x << std::endl;
x = 3.0; // Why is this allowed? because it does a narrowing conversion from double to char
// my compiler even gives this warning :
// main.cpp(11,6): warning C4244: '=': conversion from 'double' to 'char', possible loss of data
// type of x is still the same and it is still a char
static_assert(std::is_same_v<decltype(x), char>);
std::cout << static_cast<int>(x) << std::endl; // the cast is here to be able to print the actual value of the char
return 0;
}
But when I use the auto keyword to declare a string
你糊涂了。此代码声明类型为 char
:
auto x = '2';
如果你想声明一个字符串,你必须使用双引号:
auto x = "2";
3.0
的后续赋值将不会通过此更改进行编译。