Q:

Why is g++ saying about ill-formed narrowing when it's clearly well-defined in given case?

Consider the code:
volatile unsigned int test;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
unsigned char arr[]={test&0xff};

Here whatever value test has, test&0xff will always fit into unsigned char. Still I get the compiler warning:

warning: narrowing conversion of ‘(((unsigned int)test) & 255u)’ from ‘unsigned int’ to ‘unsigned char’ inside { } is ill-formed in C++11 [-Wnarrowing]

Is narrowing always ill-formed for any values in C++11?
Is there a way to retain clear code without explicit conversions, but not get warning (and errors with C++11 mode) in such cases as this?

A:

I believe it would put them together and still get a 32 bit int.  Yes, the values would technically fit into a char, but it's the type of the output from the operation, and not the data within.  Note that both test and 0xff would be 32 bits.  Try casting the output:
(unsigned char)(test & 0xff)

